簡(jiǎn)介
對(duì)象的 Symbol.hasInstance
屬性腿准,指向一個(gè)內(nèi)部方法杂穷。當(dāng)其他對(duì)象使用 instanceof
運(yùn)算符鸟废,判斷是否為該對(duì)象的實(shí)例時(shí)猜敢,會(huì)調(diào)用這個(gè)方法。比如盒延,foo instanceof Foo
在語(yǔ)言?xún)?nèi)部缩擂,實(shí)際調(diào)用的是 Foo[Symbol.hasInstance](foo)
。詳解見(jiàn) 阮一峰的ES6教程添寺。
檢驗(yàn)
基于上述內(nèi)容我做了一個(gè)檢驗(yàn)胯盯,在多個(gè)內(nèi)置函數(shù)中均找到了 Symbol.hasInstance
方法,比如 Array
计露、String
博脑、 Object
楞捂、Boolean
、Number
等趋厉。
Array[Symbol.hasInstance] // ? [Symbol.hasInstance]() { [native code] }
String[Symbol.hasInstance] // ? [Symbol.hasInstance]() { [native code] }
Object[Symbol.hasInstance] // ? [Symbol.hasInstance]() { [native code] }
Boolean[Symbol.hasInstance] // ? [Symbol.hasInstance]() { [native code] }
Number[Symbol.hasInstance] // ? [Symbol.hasInstance]() { [native code] }
并且這些方法都是同一個(gè)方法:
Array[Symbol.hasInstance] === String[Symbol.hasInstance] // true
String[Symbol.hasInstance] === Object[Symbol.hasInstance] // true
Object[Symbol.hasInstance] === Boolean[Symbol.hasInstance] // true
Boolean[Symbol.hasInstance] === Number[Symbol.hasInstance] // true
猜想: 這些方法可能都來(lái)自于原型鏈上寨闹,因?yàn)樯鲜龊瘮?shù)都是Function
的實(shí)例,于是找到上級(jí)的原型 Function.prototype
君账,果不其然繁堡。
Function.prototype.hasOwnProperty(Symbol.hasInstance) // true
用法
借用 阮一峰 老師寫(xiě)的例子:
class Even {
static [Symbol.hasInstance](obj) {
return Number(obj) % 2 === 0;
}
}
// 等同于
const Even = {
[Symbol.hasInstance](obj) {
return Number(obj) % 2 === 0;
}
};
1 instanceof Even // false
2 instanceof Even // true
12345 instanceof Even // false
是不是很酷,可以直接自定義
instanceof
的用法乡数,于是我突發(fā)奇想椭蹄,實(shí)現(xiàn)一個(gè)通過(guò)instanceof
判斷是不是基本數(shù)據(jù)
類(lèi)型的例子,如下:
class BasicType {
static [Symbol.hasInstance](data) {
// 把 除了null以外的所有基本數(shù)據(jù)類(lèi)型放到一個(gè)數(shù)組里
const basics = ['string', 'number', 'boolean', 'undefined', 'symbol', 'bigint']
// 判斷 typeof 之后的結(jié)果是否在這個(gè)數(shù)組中净赴,或者 data 是否為 null
// 因?yàn)閠ypeof null為'object'绳矩,所以這里特殊判斷一下
return basics.includes(typeof data) || data === null
}
}
基本數(shù)據(jù)類(lèi)型驗(yàn)證
1 instanceof BasicType // true
'abc' instanceof BasicType // true
true instanceof BasicType // true
Symbol() instanceof BasicType // true
123n instanceof BasicType // true
undefined instanceof BasicType // true
null instanceof BasicType // true
引用數(shù)據(jù)類(lèi)型驗(yàn)證
// 對(duì)象
({}) instanceof BasicType // false
// 數(shù)組
[] instanceof BasicType // false
// 函數(shù)
Array instanceof BasicType // false
// set
new Set() instanceof BasicType // false
// map
new Map() instanceof BasicType // false
END,感謝閱讀玖翅!歡迎評(píng)論區(qū)留言討論~
上一篇: vue2 直接更改路由的query參數(shù)
下一篇: Symbol.isConcatSpreadable 用法