数组中.Length返回字符串的个数,而不是数组元素的个数
array.length returns number of strings instead of number of array elements
简单的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中还可以防止污染全局命名空间。
相关文章:
- 在函数中添加数组元素的数值
- 访问JSON对象内部的数组元素
- 使用子字符串更改数组元素值
- 在数组元素的文本中找到字符串的一部分后替换字符串的一部分
- 根据数组元素中的子字符串对 Javascript 数组进行排序
- 在mongoDb中,如果字符串输入与任何数组元素匹配,如何获取整个记录(在这种情况下,数组是记录的属性)
- 将数组的字符串元素与另一个数组的对象元素属性进行比较
- 检查字符串是否包含数组元素的任何部分
- regex将数组元素中匹配的字符串替换为不同的数组元素
- 检查字符串数组元素是否为URL的子字符串
- 数组中.Length返回字符串的个数,而不是数组元素的个数
- 声明每个洗牌字符串数组元素
- 基于"字符串"的任意数组元素;种子
- Mithril.js:为什么“组件模板必须返回一个虚拟元素,而不是数组、字符串等”?的意思
- 使用数组元素替换多个出现字符串
- Javascript检查字符串中的每个字符并返回相应位置的数组元素
- 在javascript中查找数组中字符串元素的最大出现次数
- 为什么可以'我是否在JavaScript中设置数组元素(字符串)的属性
- 从 Javascript 中作为字符串接收的数组名称访问数组元素
- 字符串解析——为什么在javascript中将输入数组元素全部解析为整数时会出现运行时错误