typeof
的八種數據類型typeof
可判斷類型比較有限,它的輸出值只有八種,即用 typeof
判斷一個變量,獲得的結果只會是如下八種類型中的一種javascript
// es5
typeof '' // string
typeof 1 // number
typeof true // boolean
typeof undefined // undefined
typeof Array // function
typeof {} // object
// es6
typeof Symbol() // symbol
// es10
typeof BigInt(1) // bigint
複製代碼
typeof
的實現原理初版 JS
的 typeof
實現以下,在 JS
誕生之初就只有六種類型判斷。java
if (JSVAL_IS_VOID(v)) { // 判斷是否爲 undefined
type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) { // 判斷是否爲 object
obj = JSVAL_TO_OBJECT(v);
if (obj && (ops = obj->map->ops, ops == &js_ObjectOps)
? (clasp = OBJ_GET_CLASS(cx, obj), clasp->call || clasp == &js_FunctionClass)
: ops->call != 0) {
type = JSTYPE_FUNCTION;
} else {
type = JSTYPE_OBJECT;
}
} else if (JSVAL_IS_NUMBER(v)) { // 判斷是否爲 number
type = JSTYPE_NUMBER;
} else if (JSVAL_IS_STRING(v)) { // 判斷是否爲 string
type = JSTYPE_STRING;
} else if (JSVAL_IS_BOOLEAN(v)) { // 判斷是否爲 boolean
type = JSTYPE_BOOLEAN;
}
複製代碼
typeof
的輸出值中沒有 array
這一項,因此當須要判斷數組類型時,能夠使用 instanceof
。instanceof
會判斷右側表達式是否在左側表達式的原型鏈上,因此下面的兩個 instanceof
都爲 true
。es6
typeof [1,2] // object
[1,2] instanceof Array // true
[1,2] instanceof Object // true
複製代碼
null
typeof
判斷 null
類型嘛?答案是 NO
,前面說了,typeof
只有八種類型,其中並無 null
這一類型,若是用 typeof
判斷,會獲得 object
的結果。數組
typeof null // object
複製代碼
由於在 Javascript
底層存儲變量的時候,會在變量的機器碼低位 1-3
位表示類型信息。而 null
的低位 1-3
解析到的爲 000
,而000
表示的是 obecjt
類型。bash
000 對象
010 浮點數
100 字符串
110 布爾值
1 整數
null:全部碼都是0
undefined:用 -2^30 表示
複製代碼
instanceof
判斷 null
類型嘛?答案依然是 NO
,由於 null
根本沒有 __proto__
屬性,因此用 instanceof
去檢測永遠都不會返回 true
ui
null instanceof Object // false
null instanceof null // 報錯
複製代碼
===
判斷是不是 null
Object.prototype.toString
判斷null === null // true
Object.prototype.toString.call(null) // [object Null]
複製代碼
拓展:Object.prototype.toString
能夠判斷全部類型es5
Object.prototype.toString.call(1) // [object Number]
Object.prototype.toString.call('') // [object String]
Object.prototype.toString.call({}) // [object Object]
Object.prototype.toString.call(true) // [object Boolean]
Object.prototype.toString.call(()=>{}) // [object Function]
Object.prototype.toString.call(null) // [object Null]
Object.prototype.toString.call(undefined) // [object Undefined]
Object.prototype.toString.call(Symbol) // [object Symbol]
Object.prototype.toString.call(1n) // [object BigInt]
複製代碼
instanceof
實現原理function new_instance_of(leftValue, rightValue) {
let rightProto = rightValue.prototype;
leftValue = leftValue.__proto__;
while(true) {
if (leftValue === null) {
return false;
}
if (leftValue === rightProto) {
return true;
}
leftValue = leftValue.__proto__
}
}
複製代碼
下面的表達式分別輸出什麼呢?若是所有回答正確,你對原型鏈和 instanceof
的理解應該很是到位了。spa
Object instanceof Object
Function instanceof Function
Function instanceof Object
Object instanceof Function
複製代碼