var name在Javascript中产生奇怪的结果
假设我们有以下代码段:var name在Javascript中产生奇怪的结果,javascript,variables,Javascript,Variables,假设我们有以下代码段: var name = ["Apples","Oranges","Strawberries"]; console.log(name.length); 这段代码产生了27的奇怪结果!!问题似乎在于使用变量名作为“name”,这似乎是一个保留关键字 但有人能解释为什么会有这种奇怪的行为吗 它指的是window.name,它是窗口的名称 您可以使用窗口的名称来定位超链接,但它通常并不有用 有关窗口的详细信息。名称: 仅在chrome中测试: 您不能阻止var name成为win
var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);
这段代码产生了27的奇怪结果!!问题似乎在于使用变量名作为“name”,这似乎是一个保留关键字
但有人能解释为什么会有这种奇怪的行为吗 它指的是
window.name
,它是窗口的名称
您可以使用窗口的名称来定位超链接,但它通常并不有用
有关窗口的详细信息。名称
:
仅在chrome中测试:
您不能阻止var name
成为window.name
,它是一个字符串。无论您将该值设置为什么,它都将被转换为字符串,因此它是一个有效的窗口名。因此,name.length
是字符串中的字符数。最好避免使用变量或非常小心
正如我从其他一些评论中看到的,如果你是新手,这是一个奇怪的概念。问题在于window.name
指的是什么<代码>窗口。名称是窗口的名称。它的任何用途都是命名窗口
为Chrome的行为辩护是合乎逻辑的:
如果这个
var document='foo'
做了它看起来应该做的事情,那么您将用一个字符串覆盖window.document
-文档对象。这将是一个相当大的问题name
是window
的一个属性,就像document
一样,它有一个不应该(也不能在Chrome中)被替换的用途。正如其他人所指出的,在全局范围内使用名为name
的变量时,它被视为window.name
通过在Google Chrome下的实验,window.name
以字符串形式获取值,如:“苹果、桔子、草莓”
,这种行为是因为Google Chrome强制将window.name
设置为字符串。这解释了为什么name.length
将报告27
,因为这是给定字符串的长度
IE、Opera或Firefox中不存在这种行为,它们将数组[“苹果”、“橙子”、“草莓”]
和`name.length
上的报告3
,与预期一致,因此我猜这是Google Chrome的一个怪癖。是一个好的开始。基本上,当您在函数外部声明name
时,实际上是在隐藏window.name
值,这是一个非常非常糟糕的主意(请非常小心您声明的任何全局变量-它们实际上是window
对象的值-包括隐藏现有值)
正如其他人所说,Google Chrome强制类型为字符串的事实可能是Chrome的一个怪癖(虽然有点可以理解),但根本原因是你只是在做一些你没有意识到自己在做的“危险”的事情:)在全局范围内,当你做
var name=[“苹果”、“橙子”、“草莓”]
,与window.name=[“苹果”、“橙子”、“草莓”相同代码>
window.name
必须是一个字符串,因此它将[“Apples”,“Oranges”,“Strawberries”]。toString()
分配给它,即“Apples,Oranges,Strawberries”
窗口对象有一个属性“name”
如果在闭包函数中定义“name”,则可能会得到3
您在全局对象中定义了var name,因此只初始化了字符串obj
(function(){
var name = ["Apples","Oranges","Strawberries"];
consol.log(name.length);
})()
var name = ["Apples","Oranges","Strawberries"];
global window.name是一个内置字符串对象(保留),因此当您退出上面的行时,会调用name.toString() 我不能复制它:我可以在Chrome控制台上复制它:数组被转换为字符串(因此长度)。显然,这会更改window.name属性,因为它必须是字符串,所以会强制转换它。啊,这取决于代码是否在函数中。我在这里复制了它:对我来说,Chrome的行为看起来是唯一的逻辑行为。@这是真的,但只有当你真正理解全局变量根本不是变量,而是它们分配给
窗口中的对象中的“字段”时,它才显得合乎逻辑。这在(浏览器)JavaScript中是一个重要的可读性问题,如果浏览器产生一个警告(“您声明的变量隐藏了窗口中的现有字段
”或类似的内容),那就太好了。如果要更改window.name
,只需将其指定给window.name
。让var name
做同样的事情是非常令人困惑的。@dystroy我确实把它称为一个怪癖而不是bug,因为我认为它是有意义的。虽然我已经在Firefox、IE和Opera上进行了测试,但他们并没有这样做。他们按预期分配数组并在name.length
上报告3
。我相信任何全局变量都可以作为window.variable\u name
引用,所以在这种情况下,我想它是预定义的。@yitwail这不是问题…name
是特殊的-它必须是字符串,因为它的用途。@m59:真正的问题是全局变量是窗口对象的“字段”。即使它没有转换为字符串,它仍然是错误的-窗口的名称将被数组覆盖@卢安:是的,我想用一种每个人都能理解的方式来解释,呵呵。如果你不习惯,那就有点抽象了。@ShadowFax Chrome的行为是最好的!覆盖窗口名称与覆盖文档本身具有可比性(但没有灾难性)。上面的代码给出了一个语法错误,它应该是console而不是console