JavaScript instanceof
instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上。(MDN)
instanceof 是另一種檢測(cè)類型的手段,但通常用于檢測(cè)對(duì)象之間的關(guān)系,如某個(gè)對(duì)象是不是由某個(gè)構(gòu)造函數(shù)生成的。
function Person(name) {
this.name = name;
}
var person = new Person('小明');
console.log(
person instanceof Person,
); // 輸出:true
1. 語(yǔ)法
對(duì)象 instanceof 構(gòu)造函數(shù);
雖然語(yǔ)法是這樣的,其實(shí)左側(cè)可以是任意數(shù)據(jù)類型,但右側(cè)必須是一個(gè)函數(shù)。
否則會(huì)報(bào)如下錯(cuò)誤:
[] instanceof {};
// Uncaught TypeError: Right-hand side of 'instanceof' is not callable
錯(cuò)誤大致意思是 instanceof
的右操作數(shù)不能被調(diào)用。
在 JavaScript
,可被調(diào)用的目前只有函數(shù)。
2. 注意點(diǎn)
使用 instanceof
檢測(cè)的時(shí)候,不一定只有一個(gè)為 true
的結(jié)果。
function Person(name) {
this.name = name;
}
var person = new Person('小明');
console.log(
person instanceof Person,
person instanceof Object,
); // 輸出:true
因?yàn)?instanceof
實(shí)際上是去左操作數(shù)的原型鏈上尋找有沒(méi)有右操作數(shù)的原型
。
person
的原型鏈上既匹配到 Person.prototype
又能匹配到 Object.prototype
,所以都能返回 true
。
使用的時(shí)候要注意這個(gè)問(wèn)題,如判斷某個(gè)對(duì)象的原型鏈上是否有 Object.prototype
的時(shí)候,要考慮到一些其他對(duì)象。
[] instanceof Object; // true
數(shù)組的原型鏈上也是有 Object.prototype
的,所以做一些檢測(cè)的時(shí)候要考慮一些特殊情況。
3. 小結(jié)
instanceof 可以用來(lái)檢測(cè)對(duì)象和構(gòu)造函數(shù)之間的關(guān)系,其檢測(cè)的原理是左操作數(shù)的原型上是否有右操作數(shù)的 prototype
屬性,所以要注意一些檢測(cè)的特殊情況。