当我做下面的片段时
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
var str = new String("NewDelhi");
var count = new Number(10);
console.log(str instanceof String); //true
console.log(count instanceof Number); //true
为什么会发生这种事。
发布于 2015-05-27 03:58:36
这是因为name
不是变量,而是window
对象中的一个属性。当您尝试创建一个名为name
的全局变量时,将忽略该变量,并将使用现有属性。
属性的类型是字符串原语,而不是字符串对象。变量的类型是动态的,因此它可以包含字符串原语或字符串对象,但是属性具有特定的类型,只能保存字符串原语。
typeof name
将返回"string"
,而不是"object"
。因为它不是对象,所以它不是String
类的实例。
发布于 2015-05-27 03:53:42
我只是写了一个小片段
function test(){
window.name = 'Hello World';
alert(name);
}
如果您尝试它,您将看到它将输出"Hello“,因此您的问题是由变量范围引起的。
当您调用console.log(name instanceof String)
时,实际上是在执行console.log(window.name instanceof String);
此外,window.name是原语字符串,而不是对象,因此要检查它是否为字符串,请尝试如下所示:
alert(typeof name === "string" );
它将输出'true'
!
发布于 2015-05-27 04:20:38
前面的答案似乎并没有强调这是一个特例。这种行为不仅是因为全局window
对象已经具有名称param,而且因为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 (甚至可能需要将此问题标记为副本)。
https://stackoverflow.com/questions/30481323
复制相似问题