遇事不决上MDN,参照
JavaScript相等性判断
Undefined | Null | Number | String | Boolean | Object | ||
---|---|---|---|---|---|---|---|
Undefined | true | true | false | false | false | IsFalsy(B) | |
Null | true | true | false | false | false | IsFalsy(B) | |
Number | false | false | A === B | A === ToNumber(B) | A=== ToNumber(B) | A== ToPrimitive(B) | |
String | false | false | ToNumber(A) === B | A === B | ToNumber(A) === ToNumber(B) | ToPrimitive(B) == A | |
Boolean | false | false | ToNumber(A) === B | ToNumber(A) === ToNumber(B) | A === B | ToNumber(A) == ToPrimitive(B) | |
Object | false | false | ToPrimitive(A) == B | ToPrimitive(A) == B | ToPrimitive(A) == ToNumber(B) | A === B |
null == undefined // true
instanceof
运算符在 JavaScript 中用于测试构造函数的 prototype
属性是否出现在对象的原型链中。"原型链"是一个用于实现继承和共享属性的 JavaScript 对象模型。
当你执行 null instanceof Object
时,JavaScript 会试图查找 null
的原型链以检查其中是否有 Object.prototype
。但是,null
是一个特殊的值,表示“没有对象”,因此它没有原型链。由于 null
没有原型链,所以 Object.prototype
不可能出现在 null
的原型链中,因此 null instanceof Object
的结果是 false
。
这就是为什么我们说 null
不是对象类型的原因。尽管在 JavaScript 中,几乎所有的东西都是对象,但 null
和 undefined
是两个例外。它们都是特殊的值,表示“没有值”或“没有对象”,并且它们都没有原型链或对象包装器。所以,当你试图对它们执行像 instanceof
这样的操作时,结果通常会让人感到意外。
o instanceof f
这个表达式的结果取决于 o
和 f
的具体值。在 JavaScript 中,instanceof
运算符用来检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。
当你执行 o instanceof f
时,JavaScript 会试图查找 o
的原型链以检查其中是否有 f.prototype
。如果 f.prototype
出现在 o
的原型链中,那么 o instanceof f
的结果就是 true
。否则,结果就是 false
。
这是一个例子:
function F() {} var o = new F(); console.log(o instanceof F); // 输出:true
在这个例子中,我们定义了一个名为 F
的构造函数,并用它来创建了一个新的对象 o
。因为 o
是由 F
构造的,所以 F.prototype
出现在了 o
的原型链上,因此 o instanceof F
的结果是 true
。
然而,如果我们改变 o
或者 F.prototype
,那么结果可能就会不同。例如:
function F() {} var o = new F(); F.prototype = {}; console.log(o instanceof F); // 输出:false
在这个例子中,我们改变了 F.prototype
,所以它不再出现在 o
的原型链上。因此,即使 o
最初是由 F
构造的,但现在 o instanceof F
的结果也是 false
。
总的来说,你可以把 instanceof
看作是一种检查对象是否由特定构造函数创建,或者是否继承自特定构造函数的一种方式。