typeof 並不可以準確判斷類型,對於基本數據類型來講,除了null以外,都能正確的顯示類型 bash
可是對於 對象來講typeof不能準確判斷類型,typeof 函數會返回 function,除此以外所有都是 object,不能準確判斷類型 ![]()
console.log(typeof '');//string
console.log(typeof []);//object
console.log(typeof {});//object
console.log(typeof 1);//number
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof true);//boolean
console.log(typeof function(){});//function
console.log(typeof /\d/);//object
複製代碼
因此判斷對象數據類型時不該該用typeof,而應該用
instanceof
,instanceof
是基於原型鏈判斷對象的,能夠判斷複雜的對象函數
console.log([] instanceof Array);//true
console.log({} instanceof Object);//true
console.log(/\d/ instanceof RegExp);//true
console.log(function(){} instanceof Object);//true
console.log(function(){} instanceof Function);//true
複製代碼
這裏在網上沒找到合適的方法,借鑑學長的post
class PrimitiveNumber {
static [Symbol.hasInstance](x) {
return typeof x === 'number'
}
}
console.log(111 instanceof PrimitiveNumber) // true
複製代碼
這裏的
Symbol.hasInstance
用於判斷某對象是否爲某構造器的實例,當其餘對象使用instanceof運算符,判斷是否爲該對象的實例時,會調用這個方法。ui學長說:「其實就是自定義
instanceof
行爲的一種方式,這裏將原有的instanceof
方法重定義,換成了typeof,所以可以判斷基本數據類型」spa
規則:prototype
instanceof
用於判斷某個對象是不是另外一個對象(構造方法)的實例。instanceof
會查找**原型鏈**,直到null
若是還不是後面這個對象的實例的話就返回false
,不然就返回true
3d
function instanceofFunc(obj, cons) {
// 錯誤判斷 構造函數必須是一個function 其餘的均報錯
if (typeof cons !== 'function') throw new Error('instance error')
if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) return false
// 獲取到原型對象
let proto = cons.prototype
// 若是obj的原型對象不是null
while (obj.__proto__) {
if (obj.__proto__ === proto) return true
obj = obj.__proto__
}
return false
}
console.log(instanceofFunc(() => {}, Function)) // true
複製代碼
//原型鏈的內容連接了掘金的講解,看起來蠻不錯的!code