instanceof
åºçº¿
广æ³å¯ç¨
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
instanceof è¿ç®ç¬¦ç¨äºæ£æµæé 彿°ç prototype 屿§æ¯å¦åºç°å¨æä¸ªå®ä¾å¯¹è±¡çååé¾ä¸ãå
¶è¿å弿¯ä¸ä¸ªå¸å°å¼ãå¯ä»¥éè¿ Symbol.hasInstance æ¥èªå®ä¹è¯¥è¿ç®ç¬¦çè¡ä¸ºã
å°è¯ä¸ä¸
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car("Honda", "Accord", 1998);
console.log(auto instanceof Car);
// 颿è¾åºï¼true
console.log(auto instanceof Object);
// 颿è¾åºï¼true
è¯æ³
object instanceof constructor
åæ°
object-
è¦æµè¯ç对象
constructor-
æµè¯å¯¹ç §çæé 彿°
å¼å¸¸
TypeError-
妿
constructor䏿¯å¯¹è±¡ï¼æconstructor没æ[Symbol.hasInstance]()æ¹æ³ï¼é£ä¹å®ä¸å®æ¯ä¸ä¸ªå½æ°ï¼ï¼åæåºè¯¥å¼å¸¸ã
æè¿°
instanceof è¿ç®ç¬¦ç¨æ¥æ£æµ constructor.prototype æ¯å¦åå¨äºåæ° object çååé¾ä¸ã
// å®ä¹æé 彿°
function C() {}
function D() {}
const o = new C();
// trueï¼å 为ï¼Object.getPrototypeOf(o) === C.prototype
o instanceof C;
// falseï¼å 为 D.prototype ä¸å¨ o çååé¾ä¸
o instanceof D;
o instanceof Object; // trueï¼åå å¦ä¸ï¼
C.prototype instanceof Object; // true
// éæ°èµå¼ `constructor.prototype`ï¼å¨å®è·µä¸å¾ç½è§
C.prototype = {};
const o2 = new C();
o2 instanceof C; // true
// falseï¼C.prototype æåäºä¸ä¸ªç©ºå¯¹è±¡ï¼è¿ä¸ªç©ºå¯¹è±¡ä¸å¨ o çååé¾ä¸
o instanceof C;
D.prototype = new C(); // ç»§æ¿
const o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true å 为 C.prototype ç°å¨å¨ o3 çååé¾ä¸
éè¦æ³¨æçæ¯ï¼å¦æè¡¨è¾¾å¼ obj instanceof Foo è¿å trueï¼å并䏿å³ç该表达å¼ä¼æ°¸è¿è¿å trueï¼å 为 Foo.prototype 屿§ç弿å¯è½ä¼æ¹åï¼æ¹åä¹åçå¼å¾æå¯è½ä¸åå¨äº obj çååé¾ä¸ï¼è¿æ¶å表达å¼çå¼å°±ä¼æä¸º falseãå¦å¤ä¸ç§æ
åµä¸ï¼å表达å¼çå¼ä¹ä¼æ¹åï¼å°±æ¯æ¹å对象 obj çååé¾çæ
åµï¼è½ç¶å¨ç®åç ES è§èä¸ï¼æä»¬åªè½è¯»å对象çååèä¸è½æ¹åå®ï¼ä½åå©äºéæ åç __proto__ ä¼ªå±æ§ï¼æ¯å¯ä»¥å®ç°çãæ¯å¦æ§è¡ obj.__proto__ = {} ä¹åï¼obj instanceof Foo å°±ä¼è¿å false äºã
instanceof åå¤å
¨å±å¯¹è±¡ (ä¾å¦ï¼å¤ä¸ª frame æå¤ä¸ª window ä¹é´ç交äº)
卿µè§å¨ä¸ï¼æä»¬çèæ¬å¯è½éè¦å¨å¤ä¸ªçªå£ä¹é´è¿è¡äº¤äºãå¤ä¸ªçªå£æå³çå¤ä¸ªå
¨å±ç¯å¢ï¼ä¸åçå
¨å±ç¯å¢æ¥æä¸åçå
¨å±å¯¹è±¡ï¼ä»èæ¥æä¸åçå
置类åæé 彿°ãè¿å¯è½ä¼å¼åä¸äºé®é¢ãæ¯å¦ï¼è¡¨è¾¾å¼ [] instanceof window.frames[0].Array ä¼è¿å falseï¼å 为 Array.prototype !== window.frames[0].Array.prototypeï¼å¹¶ä¸æ°ç»ä»åè
ç»§æ¿ã
èµ·åï¼ä½ ä¼è®¤ä¸ºè¿æ ·å¹¶æ²¡ææä¹ï¼ä½æ¯å½ä½ å¨ä½ çèæ¬ä¸å¼å§å¤çå¤ä¸ª frame æå¤ä¸ª window 以åéè¿å½æ°å°å¯¹è±¡ä»ä¸ä¸ªçªå£ä¼ å°å¦ä¸ä¸ªçªå£æ¶ï¼è¿å°±æ¯ä¸ä¸ªææè强大çè¯é¢ãæ¯å¦ï¼å®é
ä¸ä½ å¯ä»¥éè¿ä½¿ç¨Array.isArray(myObj) æè
Object.prototype.toString.call(myObj) === "[object Array]" æ¥å®å
¨çæ£æµä¼ è¿æ¥ç对象æ¯å¦æ¯ä¸ä¸ªæ°ç»ã
æ¯å¦æ£æµä¸ä¸ª Nodes å¨å¦ä¸ä¸ªçªå£ä¸æ¯ä¸æ¯ SVGElementï¼ä½ å¯ä»¥ä½¿ç¨myNode instanceof myNode.ownerDocument.defaultView.SVGElement
夿³¨ï¼å¨ä»£ç ä¸ä½¿ç¨ XPCOM instanceof æç¹æ®å½±åï¼å¦ææ¥è¯¢æ¥å£æåæ§è¡åï¼obj instanceof xpcomInterface (e.g. Components.interfaces.nsIFile) è°ç¨obj.QueryInterface(xpcomInterface) å¹¶ä¸è¿å true ãè¿ç§è°ç¨çå¯ä½ç¨æ¯å¨ä¸æ¬¡æåç instanceof æµè¯åï¼ä½ å¯ä»¥å¨ obj ä¸ä½¿ç¨xpcomInterface ç屿§ãè¿ä¸æ åç JavaScript å
¨å±åéä¸åï¼å³ä½¿ obj æ¥èªä¸åçä½ç¨åï¼obj instanceof xpcomInterface ä¹å¯ä»¥æé¢æäº§çä½ç¨ã
示ä¾
>æ¼ç¤º String 对象å Date 对象é½å±äº Object ç±»ååä¸äºç¹æ®æ
åµ
ä¸é¢ç代ç 使ç¨äº instanceof æ¥è¯æï¼String å Date å¯¹è±¡åæ¶ä¹å±äºObject ç±»åï¼ä»ä»¬æ¯ç± Object 类派çåºæ¥çï¼ã
使¯ï¼ä½¿ç¨å¯¹è±¡åé¢é符å·å建ç对象å¨è¿éæ¯ä¸ä¸ªä¾å¤ï¼è½ç¶ååæªå®ä¹ï¼ä½ instanceof Object è¿å trueã
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = {};
var myNonObj = Object.create(null);
simpleStr instanceof String; // è¿å falseï¼é对象å®ä¾ï¼å æ¤è¿å false
myString instanceof String; // è¿å true
newStr instanceof String; // è¿å true
myString instanceof Object; // è¿å true
myObj instanceof Object; // è¿å trueï¼å°½ç®¡ååæ²¡æå®ä¹
({}) instanceof Object; // è¿å trueï¼åä¸
myNonObj instanceof Object; // è¿å falseï¼ä¸ç§å建é Object å®ä¾çå¯¹è±¡çæ¹æ³
myString instanceof Date; //è¿å false
myDate instanceof Date; // è¿å true
myDate instanceof Object; // è¿å true
myDate instanceof String; // è¿å false
æ¼ç¤º mycar å±äº Car ç±»åçåæ¶åå±äº Object ç±»å
ä¸é¢ç代ç å建äºä¸ä¸ªç±»å Carï¼ä»¥å该类åç对象å®ä¾ mycar. instanceof è¿ç®ç¬¦è¡¨æäºè¿ä¸ª mycar 对象æ¢å±äº Car ç±»åï¼åå±äº Object ç±»åã
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
var a = mycar instanceof Car; // è¿å true
var b = mycar instanceof Object; // è¿å true
䏿¯...çå®ä¾
è¦æ£æµå¯¹è±¡ä¸æ¯æä¸ªæé 彿°çå®ä¾æ¶ï¼ä½ å¯ä»¥è¿æ ·å
if (!(mycar instanceof Car)) {
// Do something, like mycar = new Car(mycar)
}
è¿å以ä¸ä»£ç å®å ¨ä¸å
if (!mycar instanceof Car)
è¿æ®µä»£ç æ°¸è¿ä¼å¾å° falseï¼!mycar å°å¨ instanceof ä¹å被å¤çï¼æä»¥ä½ æ»æ¯å¨éªè¯ä¸ä¸ªå¸å°å¼æ¯å¦æ¯ Car çä¸ä¸ªå®ä¾ï¼ã
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-relational-operators> |