对于 instanceof Array 和 String 的混淆

16 浏览
0 Comments

对于 instanceof Array 和 String 的混淆

我阅读了instanceof的回答,但我有一个问题。

当我编写代码

["a","b"] instanceof Array

为什么它返回true,与此同时

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

也返回true,但是

"a" instanceof String

返回false,而不是与此相同

new String("ab") instanceof String 

非常感谢你们的答案和帮助!

0
0 Comments

在JavaScript中,字符串有两种类型:原始字符串和String类的实例。它们并不相同。根据MDN的解释,原始字符串和String对象的区别在于对象可以添加属性,而原始字符串不能。以下是MDN中关于两者区别的解释:

另一种可以看出区别的方式是,可以为对象添加属性,但是添加属性不会影响到原始字符串。例如:

var a = "a";
a.b = 3; // 不会将属性添加到a,而是添加到一个包装后的副本
console.log(a.b);  // 输出undefined
a = new String("a");
a.b = 3;
console.log(a.b);  // 输出3

需要记住的是,大多数情况下应该使用原始字符串。

对于数组而言,只有数组类型,不存在原始数组的概念。

对于对象属性和原始字符串属性的区别的评论给予了+1的赞同。

0
0 Comments

在这种情况下,"a"不是一个String对象,它是一个String字面量或者称之为"原始值"。

所以JS没有背叛你,声称"a"不是String的一个实例。

根据MDN关于String的说明,字符串字面量和字符串原始值是不同的。字面量是一个语法结构,它告诉词法分析器这个字符序列应该是一个字符串。字符串原始值是在运行时存在的数据类型(不是在解析时)。不过,字符串字面量总是会产生一个字符串原始值。

谢谢你澄清这个问题。在Javascript中,我以为它们可以互换使用。

它们可能经常可以互换使用,但这并不意味着是正确的。而且我有点挑剔 😉

0
0 Comments

出现的原因:因为字符串(string)不是一个对象,所以在进行instanceof检查时会返回false。

解决方法:可以使用自定义的instanceOf函数来替代原生的instanceof操作符。以下是一个示例的自定义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;
        }
    }
}

在自定义的instanceOf函数中,参数F代表构造函数(constructor),参数V代表要检查的值。可以通过调用instanceOf(F, V)来判断值V是否是构造函数F的实例。

以上是关于instanceof Array和String之间的混淆问题的原因和解决方法的整理。

0