我正在学习Javascript。作为学习的一部分,我遇到了下面的场景,我希望a1.length (代码的最后一行)显示201,但它显示101,你知道吗?
var a1 = new Array();
for (var i = -100; i<=100; i++)
a1[i] = i;
for (var i in a1)
{
document.write(i + "=" + a1[i])
document.write("<br>");
}
document.write(a1.length);发布于 2012-11-12 00:24:16
我将把我最初的评论转换成一个更全面的答案。
在.length中计算的数组索引从0开始向上。负索引被认为是对象的属性,而不是数组值。正如您从下面的ECMAScript规范中看到的那样,数组索引本质上只是给定一些特殊处理的特定类型的属性值。
来自ECMAScript spec的15.4节
15.4数组对象
数组对象对特定类的属性名给予特殊处理。当且仅当ToString( ToUint32(P) )等于P且ToUint32(P)不等于2^32时,属性名P(以字符串值的形式)才是数组索引。属性名为数组索引的属性也称为元素。每个Array对象都有一个length属性,该属性的值始终是小于2^32的非负整数。length属性的值在数字上大于名称为数组索引的每个属性的名称;每当创建或更改array对象的属性时,都会根据需要调整其它属性以保持此不变性。具体地说,每当添加名称为数组索引的属性时,如有必要,length属性将被更改为比该数组索引的数值大1;并且每当更改length属性时,其名称为值不小于新长度的数组索引的每个属性都会被自动删除。此约束仅适用于Array对象的自身属性,不受可从其原型继承的长度或数组索引属性的影响。
此外,您永远不应该使用"iterate" arrays with a for-in-loop
for (var i in a1)这将迭代a1的所有可枚举属性,其中将包括所有数组索引,但也可以包括其他属性。如果您只想使用for循环迭代数组元素,则应该使用另一种形式:
for (var i = 0, len = a1.length; i < len; i++) 它的类型稍微多了一点,但安全多了。
或者,在更现代的浏览器中,您可以使用.forEach() method。
https://stackoverflow.com/questions/13333000
复制相似问题