JavaScript中常見的數(shù)據類型判斷方法小結
一、typeof
typeof運算符返回一個字符串, 表示操作數(shù)的類型, 使用語法:typeof <操作數(shù)>
1.1 規(guī)則
下表, 是 typeof 針對不同數(shù)據類型, 返回的結果值
| 類型 | 結果 |
|---|---|
Boolean | "boolean" |
String | "string" |
Number | "number" |
BigInt | "bigint" |
Symbol | "symbol" |
Undefined | "undefined" |
Null | "object" |
Function (在 class 也是函數(shù)) | "function" |
| 其他任何對象 | "object" |
示例代碼如下:
console.log(typeof true) // boolean
console.log(typeof '123') // string
console.log(typeof 11111) // number
console.log(typeof Math.LN2) // number
console.log(typeof Infinity) // number
console.log(typeof NaN) // number
console.log(typeof BigInt(11111)) // bigint
console.log(typeof Symbol(1111)) // symbol
console.log(typeof undefined) // undefined
console.log(typeof null) // object
console.log(typeof (() => {})) // function
console.log(typeof class {}) // function
console.log(typeof {}) // object
console.log(typeof []) // object
console.log(typeof /abc/) // object
console.log(typeof new Date()) // object
console.log(typeof new Promise(() => {})) // object1.2 為什么「typeof null」等于「object」
// JavaScript 誕生以來便如此 typeof null === "object";
- 在
JS中typeof null的結果為"object", 這是從JS的第一版遺留至今的一個bug - 在
JS最初的實現(xiàn)中,JS中的值是由一個表示類型的標簽和實際數(shù)據值表示的, 對象的類型標簽是0, 由于null代表的是空指針, 在大多數(shù)平臺下值表示為0x00, 因此,null的類型標簽是0, 因此typeof null也就返回了object - 當然針對這個
BUG曾有一個ECMAScript的修復提案, 但是被拒絕了, 原因是遺留代碼太多了, 如果修改的話影響太廣, 不如繼續(xù)將錯就錯當個和事老
1.3 為什么「typeof (() => {})」等于 「function」
首先我們需要了解一個小知識, 函數(shù)是什么? 為什么被調用?
function 實際上是 object 的一個 子類型, 更深點說, 函數(shù)是一個可以被調用的對象; 那么它為什么能夠被調用呢? 那是因為其內部實現(xiàn)了 [[Call]] 方法, 當函數(shù)對象被調用時會執(zhí)行內部方法 [[call]]
那么回到正題, 為什么 typeof (() => {}) 會返回 function? 這里主要還是要看 ES6 中 typeof 是如何區(qū)分函數(shù)和對象類型的:
- 一個對象如果沒有實現(xiàn)
[[Call]]內部方法, 那么它就返回object - 一個對象如果實現(xiàn)了
[[Call]]內部方法, 那么它就返回function
1.4 注意事項
- 所有使用
構造函數(shù)創(chuàng)建的數(shù)據,typeof都會返回object或function
const str = new String("String");
const num = new Number(100);
typeof str; // "object"
typeof num; // "object"
const func = new Function();
typeof func; // "function"typeof操作符的優(yōu)先級高于加法 (+)等二進制操作符, 因此, 必要時候記得用括號
// 括號有無將決定表達式的類型。 const someData = 99; typeof someData + " Wisen"; // "number Wisen" typeof (someData + " Wisen"); // "string"
二、instanceof & isPrototypeOf()
在 JS 中我們有 兩種 方式可以判斷 原型 是否存在于某個 實例 的 原型鏈 上, 通過這種判斷就可以幫助我們, 確定 引用數(shù)據 的具體類型; 需要注意的是該方法 只能用于判斷引用數(shù)據, 無法判斷 基本數(shù)據 類型
2.1 instanceof
介紹:
instanceof運算符用于檢測構造函數(shù)的prototype屬性是否出現(xiàn)在某個實例對象的原型鏈上語法:
實例對象 instanceof 構造函數(shù), 返回一個Boolean值示例:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
auto instanceof Car // Car.prototype 是否在 auto 原型鏈上, true
auto instanceof Object // Object.prototype 是否在 auto 原型鏈上, true2.2 Object.prototype.isPrototypeOf()
介紹:
isPrototypeOf()方法用于檢查一個對象是否存在于另一個對象的原型鏈中語法:
原型.isPrototypeOf(實例), 返回一個布爾值示例:
function Car() {}
const auto = new Car();
Car.prototype.isPrototypeOf(auto) // Car.prototype 是否在 auto 原型鏈上, true
Object.prototype.isPrototypeOf(auto) // Object.prototype 是否在 auto 原型鏈上, true三、根據「constructor」進行判斷
constructor 判斷方法跟 instanceof 相似, 如下圖是 原型、實例、構造函數(shù) 之間的一個關系圖, 從圖可知, 在 實例對象的原型 中存在 constructor 指向 構造函數(shù), 那么借用這個特性我們可以用于判斷 數(shù)據 類型

function Car() {}
const auto = new Car();
auto.constructor === Car // true不同于 instanceof, 通過該方式既可以處理 引用數(shù)據、又能夠處理 基本數(shù)據
(123).constructor === Number // true
(true).constructor === Boolean // true
('bar').constructor === String // true不同于 instanceof, 不能判斷 對象父類
class A {}
class B extends A {}
const b = new B()
b.constructor === B // true
b.constructor === A // false
b instanceof B // true
b instanceof A // true注意: null 和 undefined 沒有 constructor, 所以它是無法檢測 Null undefined
四、Object.prototype.toString.call()
Object.prototype.toString() 方法返回一個表示該對象的字符串, 該字符串格式為 "[object Type]", 這里的 Type 就是對象的類型
const toString = Object.prototype.toString; toString.call(111); // [object Number] toString.call(null); // [object Null] toString.call(undefined); // [object Undefined] toString.call(Math); // [object Math] toString.call(new Date()); // [object Date] toString.call(new String()); // [object String]
注意: 對于自定義構造函數(shù)實例化出來的對象, 返回的是 [object Object]
const toString = Object.prototype.toString;
function Bar(){}
toString.call(new Bar()); // [object Object]默認, 如果一個對象有 Symbol.toStringTag 屬性并且該屬性值是個字符串, 那么這個屬性值, 會被用作 Object.prototype.toString() 返回內容的 Type 值進行展示
const toString = Object.prototype.toString;
const obj = {
[Symbol.toStringTag]: 'Bar'
}
toString.call(obj) // [object Bar]補充: 一個通用方法, 一行代碼獲取 數(shù)據的類型
const getType = (data) => {
return Object.prototype.toString.call(someType)
.slice(8, -1)
.toLocaleLowerCase()
}五、總結
| 判斷方法 | 基本類型 | 引用類型 | 父類 | null | undefined |
|---|---|---|---|---|---|
typeof | ? | ? | ? | ? | ? |
instanceof & isPrototypeOf() | ? | ? | ? | ? | ? |
constructor | ? | ? | ? | ? | ? |
Object.prototype.toString.call() | ? | ? | ? | ? | ? |
| 標題 |
|---|
typeof適合用于判斷基本類型, 特別的是:Null會返回object、Function返回function、其余引用類型都返回objectinstanceof & isPrototypeOf()可以用于判斷引用數(shù)據的類型, 同時可判斷對象父類constructor可用于基本類型、引用類型, 但是不可判斷null、undefined, 并且無法判斷對象父類Object.prototype.toString.call()萬能方法, 對于JS中所有類型都能夠識別出來, 唯一不足的可能是無法判斷對象父類(但是問題不大)
以上就是JavaScript中常見的數(shù)據類型判斷方法小結的詳細內容,更多關于JavaScript 判斷方法的資料請關注腳本之家其它相關文章!
相關文章
JavaScript監(jiān)聽DOM尺寸變化的解決方案
文章分析了傳統(tǒng)resize監(jiān)聽的弊端,如粒度粗糙、性能問題等并提出了多種解決方案,通過插入<object>、監(jiān)聽scroll或使用現(xiàn)代的ResizeObserver API等來實現(xiàn)了更精準、高效地的元素尺寸監(jiān)聽,文章還討論了這些方法的優(yōu)缺點及適用場景,需要的朋友可以參考下2026-05-05
document.createElement()用法及注意事項(ff下不兼容)
今天處理了一個日期選擇器的ie和ff的兼容問題,本來這種情況就很難找錯誤,找了好久才把錯誤定位到js中創(chuàng)建元素的方法document.createElement(),這個方法在ie下支持這樣創(chuàng)建元素2013-03-03
如何通過Proxy實現(xiàn)JSBridge模塊化封裝
這篇文章主要介紹了如何通過Proxy實現(xiàn)JSBridge模塊化封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10

