数组中.Length返回字符串的个数,而不是数组元素的个数

array.length returns number of strings instead of number of array elements

本文关键字:数组元素 字符串 Length 数组 返回      更新时间:2023-09-26

简单的javascript,用来警告数组元素的数量

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

但是当我运行代码时,它会警告name数组中的字符串数量。同样,如果我警告name[1],它会警告I而不是Kevin。如果我将数组的名称更改为其他东西,例如friendsNames,它将按预期运行。是什么让变量"name"改变了行为?

浏览器中的全局对象是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]);

全局命名空间中的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中还可以防止污染全局命名空间。