在javascript中由instanceof输出的怪异内容

时间:2015-05-27 11:36:40

标签: javascript javascript-objects instanceof

当我正在执行以下代码段

var name = new String("NewDelhi");
var count = new Number(10);
console.log(name instanceof String); //false
console.log(count instanceof Number); //true

当我使用名称作为变量时,它显示我的错误 给它一些其他变量,它显示真实

var str = new String("NewDelhi");
var count = new Number(10);
console.log(str instanceof String); //true
console.log(count instanceof Number); //true

为什么会这样。

4 个答案:

答案 0 :(得分:1)

那是因为name不是变量,它是window对象中的属性。当您尝试创建名为name的全局变量时,将忽略该变量,而将使用现有属性。

属性的类型是字符串基元,而不是字符串对象。变量的类型是动态的,因此它既可以包含字符串原语或String对象,但该属性具有特定类型,并且只能包含字符串原语。

typeof name将返回"string",而非"object"。因为它不是一个对象,所以它不是String类的实例。

答案 1 :(得分:0)

我刚刚编写并运行了一个小片段

function test(){
    window.name = 'Hello World';
    alert(name);
}

如果您尝试它,您将看到它将输出" Hello World",因此您的问题是由变量范围引起的。
当您致电console.log(name instanceof String)时,您实际上在做console.log(window.name instanceof String);


此外,window.name是一个原始字符串而不是一个对象,所以要检查它是否是一个字符串尝试这样的事情:

alert(typeof name === "string" );

它会输出'true'

答案 2 :(得分:0)

以前的答案似乎并没有强调这是一个特殊情况。此行为不仅是因为全局window对象已具有名称参数,而且因为window.name(=等同于浏览器环境中的全局name)被视为特殊情况,即。总是变成原始字符串。

在全局窗口对象上定义的其他属性不具备此行为,您可以尝试自己添加属性:

window.xyz = "primitive";
window.xyz = new String("NewDelhi");
window.xyz;
> String {0: "N", 1: "e", 2: "w", 3: "D", 4: "e", 5: "l", 6: "h", 7: "i", length: 8, [[PrimitiveValue]]: "NewDelhi"}

它被如此对待的原因是,可以保留属性的原始语义:它是窗口的名称,除了原始字符串之外的任何东西都没有意义。

有关详细信息,请参阅this discussion (这甚至可能需要将此问题标记为重复)

答案 3 :(得分:0)

“名称”是Window对象的保留属性。

即使将其初始化为全局变量,默认情况下也会被忽略,因为它已经是Window对象的属性。

var name = new String(“ NewDelhi”);

现在的名称是Window对象的属性,而不是String类的实例。

该属性只能保存字符串基元。

谢谢。