与instanceof Array和String混淆

时间:2013-08-07 10:03:50

标签: javascript

我读了instanceof answer,但我有一个问题 当我编码

["a","b"] instanceof Array

为什么它像

那样重新获得真实
new Array("a","b") instanceof Array

"a" instanceof String

返回false与

不同
new String("ab") instanceof String 

? 非常感谢您的回答和帮助!

3 个答案:

答案 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)

在你的情况下

"a"   

不是字符串对象,它是字符串文字或称为“基元”。 所以JS并没有背叛你,声称“a”不是String的实例。 String

上的CF MDN

答案 2 :(得分:0)

instanceof支票为defined as

  

当使用值V调用F的[[HasInstance]]内部方法时,   采取以下步骤:

     
      
  1. 如果V不是对象,则返回false。
  2.   
  3. 设O是使用属性名称“prototype”调用F的[[Get]]内部方法的结果。
  4.   
  5. 如果Type(O)不是Object,则抛出TypeError异常。
  6.   
  7. 重复   
        
    1. 设V为V的[[Prototype]]内部属性的值。
    2.   
    3. 如果V为null,则返回false。
    4.   
    5. 如果O和V引用同一个对象,则返回true。
    6.   
  8.   

因此字符串不是对象,所以字符串失败了第一步。另请注意,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;
        }
    }
}