应该提醒数组元素数量的简单javascript。
var name = ["Bill", "Kevin", "Alice"];
alert(name.length)
但是当我运行代码时,它会提醒名称数组中的字符串数量。此外,如果我提醒姓名[1],它会提醒我而不是凯文。如果我将数组的名称更改为其他名称,例如friendsNames,它按预期运行。什么是改变行为的变量“名称”?
答案 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中也会阻止您污染全局命名空间。