当我正在执行以下代码段
时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
为什么会这样。
答案 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类的实例。
该属性只能保存字符串基元。
谢谢。