首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >javascript中instanceof的奇怪输出

javascript中instanceof的奇怪输出
EN

Stack Overflow用户
提问于 2015-05-27 11:36:40
回答 4查看 173关注 0票数 4

当我做下面的片段时

代码语言:javascript
代码运行次数:0
运行
复制
var name = new String("NewDelhi");
var count = new Number(10);
console.log(name instanceof String); //false
console.log(count instanceof Number); //true

当我使用name作为变量时,它显示为false,而给它提供了其他变量,它显示为true

代码语言:javascript
代码运行次数:0
运行
复制
var str = new String("NewDelhi");
var count = new Number(10);
console.log(str instanceof String); //true
console.log(count instanceof Number); //true

为什么会发生这种事。

EN

回答 4

Stack Overflow用户

发布于 2015-05-27 11:58:36

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-05-27 11:53:42

我只是写了一个小片段

代码语言:javascript
代码运行次数:0
运行
复制
function test(){
    window.name = 'Hello World';
    alert(name);
}

如果您尝试它,您将看到它将输出"Hello“,因此您的问题是由变量范围引起的。

当您调用console.log(name instanceof String)时,实际上是在执行console.log(window.name instanceof String);

此外,window.name是原语字符串,而不是对象,因此要检查它是否为字符串,请尝试如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
alert(typeof name === "string" );

它将输出'true'

票数 0
EN

Stack Overflow用户

发布于 2015-05-27 12:20:38

前面的答案似乎并没有强调这是一个特例。这种行为不仅是因为全局window对象已经具有名称param,而且因为window.name (=等效于浏览器环境中的全局name )被视为特例,即。总是被扔进原始的绳子里。

在全局窗口对象上定义的其他属性没有这种行为,您可以尝试自己添加一个属性:

代码语言:javascript
代码运行次数:0
运行
复制
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 (甚至可能需要将此问题标记为副本)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30481323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档