让我们说我们有这段代码:
var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);
这段代码产生了这个奇怪的结果27 !!问题似乎是使用变量名称作为“名称”,它看起来像一个保留关键字。
但任何人都可以解释为什么这种奇怪的行为?
答案 0 :(得分:7)
它指的是window.name
,这是窗口的名称。
您可以使用窗口的名称来定位超链接,但它通常不常用。
有关window.name
的更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Window.name
只是在chrome中测试:
您无法阻止var name
成为window.name
,这是一个字符串。无论您将值设置为什么,它都将被转换为字符串,以便它是一个有效的窗口名称。因此,name.length
是字符串中的字符数。最好避免变数或对它们非常小心!
正如我从其他一些评论中可以看到的,如果你是新手,这是一个奇怪的概念。关注的是window.name
所指的内容。 window.name
是窗口的名称。任何使用它都会命名窗口。
捍卫Chrome的行为是合乎逻辑的:
如果这个var document = 'foo'
做了它看起来会做的事情,你就会用字符串覆盖window.document
- 文档对象。那将是一个很大的问题。 name
属于window
的属性,就像document
一样,并且有一个不应该(并且不能在Chrome中)替换的用途。
答案 1 :(得分:5)
在全球范围内,当您执行var name = ["Apples","Oranges","Strawberries"];
时,它与window.name = ["Apples","Oranges","Strawberries"];
相同。
window.name
必须是字符串,因此它会为["Apples","Oranges","Strawberries"].toString()
分配"Apples,Oranges,Strawberries"
。
答案 2 :(得分:2)
What is the scope of variables in JavaScript?是一个好的开始。基本上,当你在一个函数之外声明name
时,你实际上隐藏了window.name
值,这是一个非常非常糟糕的想法(对你声明的任何全局变量要非常小心 - 它们实际上是window
对象的值 - 包括隐藏现有值。
正如其他人所说的那样,谷歌Chrome强制将该类型强化为字符串的事实可能是一个Chrome怪癖(尽管有点可以理解),但其根本原因在于你只是在做一些“危险”的事情,你没有意识到你'干嘛:)
答案 3 :(得分:0)
正如其他人所指出的那样,在全局范围内使用名为name
的变量时,它被视为window.name
。
根据Google Chrome浏览器中的实验,window.name
会将值作为字符串获取,如下所示:"Apples,Oranges,Strawberries"
,此行为是因为Google Chrome强制window.name
为字符串。这解释了为什么name.length
将报告27
,因为这是给定字符串的长度。
这种行为在IE,Opera或Firefox中不存在,它们正在按预期在["Apples","Oranges","Strawberries"]
上对阵列3
和`name.length
进行报道,因此我猜这是Google Chrome的一个怪癖。
答案 4 :(得分:0)
窗口对象具有属性“name”;
如果你在闭包函数中定义'name',你可能得到3
您在全局对象中定义了var name,因此您只是初始化了一个字符串obj;
(function(){
var name = ["Apples","Oranges","Strawberries"];
consol.log(name.length);
})()
var name = ["Apples","Oranges","Strawberries"];
全局window.name是字符串对象中的构建(保留),因此当你删除上面的行时会调用name.toString();