我会将我的原始评论转换为更彻底的答案。
计数的数组索引.length
从0
上往下。负索引被认为是对象的属性,而不是数组值。正如您从下面的 ECMAScript 规范中看到的那样,数组索引本质上只是经过特殊处理的某些类型的属性值。
从ECMAScript 规范的第 15.4 节:
15.4 数组对象
数组对象对某一类属性名称给予特殊处理。当且仅当 ToString(ToUint32(P)) 等于 P 且 ToUint32(P) 不等于 2^32 时,属性名称 P(以字符串值的形式)是数组索引。属性名称为数组索引的属性也称为元素。每个 Array 对象都有一个长度属性,其值始终是小于 2^32 的非负整数。length 属性的值在数值上大于名称为数组索引的每个属性的名称;每当创建或更改 Array 对象的属性时,都会根据需要调整其他属性以保持此不变性。具体来说,每当添加名称为数组索引的属性时,如果需要,长度属性会更改为比该数组索引的数值大一;并且每当更改长度属性时,所有名称为数组索引且值不小于新长度的属性都会被自动删除。此约束仅适用于 Array 对象的自身属性,不受可能从其原型继承的长度或数组索引属性的影响。
此外,您永远不应该使用 for-in-loop 来“迭代”数组:
for (var i in a1)
迭代所有可枚举属性,a1
其中将包括所有数组索引,但也可能包括其他属性。如果你只想用循环迭代数组元素for
,你应该使用另一种形式:
for (var i = 0, len = a1.length; i < len; i++)
打字稍微多一点,但更安全。
或者,在更现代的浏览器中,您可以使用.forEach()
方法.