var name在Javascript中产生奇怪的结果

时间:2014-01-06 07:59:32

标签: javascript variables

让我们说我们有这段代码:

var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);

这段代码产生了这个奇怪的结果27 !!问题似乎是使用变量名称作为“名称”,它看起来像一个保留关键字。

但任何人都可以解释为什么这种奇怪的行为?

5 个答案:

答案 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();