Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
var name在Javascript中产生奇怪的结果_Javascript_Variables - Fatal编程技术网

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