我读了instanceof的答案,但是当我编码时我有一个问题
["a","b"] instanceof Array
为什么它与
new Array("a","b") instanceof Array
尽管
"a" instanceof String
返回 false 不一样
new String("ab") instanceof String
? 非常感谢您的回答和帮助!
我读了instanceof的答案,但是当我编码时我有一个问题
["a","b"] instanceof Array
为什么它与
new Array("a","b") instanceof Array
尽管
"a" instanceof String
返回 false 不一样
new String("ab") instanceof String
? 非常感谢您的回答和帮助!
对于字符串,你有两个
String
类的实例。他们不一样。
另一种查看 MDN 没有指出的差异的方法是,您可以在对象上添加属性:
var a = "a";
a.b = 3; // doesn't add the property to a but to a wrapped copy
console.log(a.b); // logs undefined
a = new String("a");
a.b = 3;
console.log(a.b); // logs 3
(请记住,大多数时候,您应该使用原始字符串)
对于数组,你只有数组,没有像原始数组那样的东西。
instanceof
检查定义为:
当 F 的 [[HasInstance]] 内部方法以值 V 被调用时,采取以下步骤:
- 如果 V 不是对象,则返回 false。
- 令 O 为使用属性名称“prototype”调用 F 的 [[Get]] 内部方法的结果。
- 如果 Type(O) 不是 Object,则抛出 TypeError 异常。
- 重复
- 令 V 为 V 的 [[Prototype]] 内部属性的值。
- 如果 V 为 null,则返回 false。
- 如果 O 和 V 引用同一个对象,则返回 true。
所以 string 第一步失败了,因为 string 不是一个对象。另请注意,new String
它返回的不是字符串,而是由名为 的构造函数构造的对象String
。这是 Java 和 Javascript 完全不同的一个例子。
这里还有一个 custom 的代码instanceOf
,让它随你的喜好工作:
function instanceOf(F, V) {
if( typeof F !== "function" ) {
throw new Error( "F must be a constructor" );
}
if( Object(V) !== V ) {
return false; //not an object
}
var O = F.prototype;
if( Object(O) !== O ) {
throw new Error( ".prototype must be an object" );
}
while( true ) {
V = Object.getPrototypeOf(V);
if( V == null ) {
return false;
}
if( V === O ) {
return true;
}
}
}