0

我读了instanceof的答案,但是当我编码时我有一个问题

["a","b"] instanceof Array

为什么它与

new Array("a","b") instanceof Array

尽管

"a" instanceof String

返回 false 不一样

new String("ab") instanceof String 

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

4

3 回答 3

2

对于字符串,你有两个

  • 原始字符串(你经常操作的那些,你从文字中得到的)
  • String类的实例。

他们不一样。

以下是 MDN 关于两者之间区别的说法

另一种查看 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

(请记住,大多数时候,您应该使用原始字符串)

对于数组,你只有数组,没有像原始数组那样的东西。

于 2013-08-07T10:05:14.730 回答
0

instanceof检查定义为:

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

  1. 如果 V 不是对象,则返回 false。
  2. 令 O 为使用属性名称“prototype”调用 F 的 [[Get]] 内部方法的结果。
  3. 如果 Type(O) 不是 Object,则抛出 TypeError 异常。
  4. 重复
    1. 令 V 为 V 的 [[Prototype]] 内部属性的值。
    2. 如果 V 为 null,则返回 false。
    3. 如果 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;
        }
    }
}
于 2013-08-07T10:13:21.250 回答
0

在你的情况下

"a"   

不是字符串对象,它是字符串文字或称为“原始”。所以 JS 并没有背叛你,声称“a”不是 String 的实例。CF MDN开启String

于 2013-08-07T10:05:47.343 回答