我读了instanceof answer,但我有一个问题 当我编码
["a","b"] instanceof Array
为什么它像
那样重新获得真实new Array("a","b") instanceof Array
而
"a" instanceof String
返回false与
不同new String("ab") instanceof String
? 非常感谢您的回答和帮助!
答案 0 :(得分:2)
对于字符串,你有两个
String
类的实例。他们不一样。
这是what the MDN says on the distinction between both。
另一种看待差异的方法是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
(请记住,大多数时候,你应该使用原始字符串)
对于数组,你只有数组,没有像基本数组那样的东西。
答案 1 :(得分:0)
答案 2 :(得分:0)
instanceof
支票为defined as:
当使用值V调用F的[[HasInstance]]内部方法时, 采取以下步骤:
- 如果V不是对象,则返回false。
- 设O是使用属性名称“prototype”调用F的[[Get]]内部方法的结果。
- 如果Type(O)不是Object,则抛出TypeError异常。
- 重复
醇>
- 设V为V的[[Prototype]]内部属性的值。
- 如果V为null,则返回false。
- 如果O和V引用同一个对象,则返回true。
因此字符串不是对象,所以字符串失败了第一步。另请注意,new String
不返回字符串,而是从名为String
的构造函数构造的对象。这是Java和Javascript完全不同的一个例子。
以下是自定义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;
}
}
}