我正在学习 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);
我会将我原来的评论转换为更彻底的答案。
计入的数组索引.length
从...来0
及以上。负索引被视为对象的属性,而不是数组值。正如您从下面的 ECMAScript 规范中看到的,数组索引本质上只是经过特殊处理的某些类型的属性值。
从第 15.4 节ECMAScript 规范 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf:
15.4 数组对象
数组对象对某一类属性名称给予特殊处理。当且仅当 ToString(ToUint32(P)) 等于 P 并且 ToUint32(P) 不等于 2^32 时,属性名称 P(以字符串值的形式)是数组索引。属性名称为数组索引的属性也称为元素。每个 Array 对象都有一个 length 属性,其值始终是小于 2^32 的非负整数。 length 属性的值在数值上大于每个名称为数组索引的属性的名称;每当创建或更改 Array 对象的属性时,都会根据需要调整其他属性以保持此不变性。具体来说,每当添加名称为数组索引的属性时,如有必要,长度属性就会更改为比该数组索引的数值大 1;每当长度属性改变时,名称为数组索引且其值不小于新长度的每个属性都会被自动删除。此约束仅适用于 Array 对象自己的属性,并且不受可能从其原型继承的长度或数组索引属性的影响。
另外,你永远不应该使用 for 循环“迭代”数组 https://stackoverflow.com/questions/500504/javascript-for-in-with-arrays:
for (var i in a1)
迭代所有可枚举属性a1
它将包括所有数组索引,但也可以包括其他属性。如果您只想迭代带有 a 的数组元素for
循环,你应该使用另一种形式:
for (var i = 0, len = a1.length; i < len; i++)
它的打字量稍微多一些,但更安全。
或者,在更现代的浏览器中,您可以使用.forEach() method https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)