array.length返回字符串数而不是数组元素数

时间:2014-07-23 16:22:04

标签: javascript

应该提醒数组元素数量的简单javascript。

var name = ["Bill", "Kevin", "Alice"];
alert(name.length)

但是当我运行代码时,它会提醒名称数组中的字符串数量。此外,如果我提醒姓名[1],它会提醒我而不是凯文。如果我将数组的名称更改为其他名称,例如friendsNames,它按预期运行。什么是改变行为的变量“名称”?

2 个答案:

答案 0 :(得分:0)

浏览器中的全局对象为window,任何顶级var语句都会表现得像您这样做:

window.name = ["Bill", "Kevin", "Alice"];
alert(name[1]);

在这种情况下,window.name有一个getter和一个将值转换为字符串的setter。这意味着你基本上有这个:

window.name = ["Bill", "Kevin", "Alice"].toString();
// = "Bill,Kevin,Alice"
alert(name[1]);

快速回答是,这是不在顶级范围内执行代码的好理由:

(function(){
    var name = ["Bill", "Kevin", "Alice"];
    alert(name[1]);
})();

或者不要在全局范围内使用name

var personNames = ["Bill", "Kevin", "Alice"];
alert(personNames[1]);

答案 1 :(得分:0)

全局命名空间中的

var name本质上是window.name(在全局命名空间中声明的任何变量属于window对象),可用于获取/设置窗口。 window.name需要是一个字符串,因此在为其赋值时,数组会被隐式转换为字符串。

如果您已登录name,则会看到Bill,Kevin,Alice。这个字符串的长度是16,这就是你所看到的。

如果您不想要此行为,可以在函数的本地范围内声明name

(function() {
    var name = ["a", "b", "c"];
    console.log(name.length); //should log 3 instead of 5
}();

将代码包装在函数或IIFE中总是更好,因为DOM会暴露许多可能无意中覆盖的全局变量,从而导致奇怪的行为。将代码包含在IIFE中也会阻止您污染全局命名空间。