在ECMAScript规范中,array.length
未定义为数组中元素的数量。
http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-array-instances-length
Array实例的length属性是一个data属性,其值始终在数字上大于名称为数组索引的每个可配置的属性的名称。
也就是说,Javascript引擎可能会导致array.length
在所有情况下都为正无穷大,并且符合标准。
考虑到这一点,我应该如何计算数组中的元素?
答案 0 :(得分:1)
什么?只需使用array.length
即可。我确定没有实现将数组长度设置为正无穷大的标准。
如果由于某种原因您确实想避免使用array.length
,请使用forEach
。
var arrLength = 0;
arr.forEach(function() {
arrLength++
})
答案 1 :(得分:1)
这不是length
属性的唯一规范。
抽象操作ArrayCreate(length, proto)
的规范说明length
属性初始化为length
参数。
Array Exotic Objects的规范说明了它的更新方式:
具体来说,每当添加名称为数组索引的属性时,如果需要,length属性的值将更改为该数组索引的数值之一
其他数组操作是根据这些操作定义的,因此length
属性应该准确反映数组元素的索引。
答案 2 :(得分:0)
Chrome阻止更改.length
媒体资源。运行这个:
var x = [];
x.length = +Infinity; // Uncaught RangeError: Invalid array length

所以,幸运的是,这里没有风险。 For
循环通过Infinity。由于某些记忆结束,可能会稍早结束。
但是,仍然可以像这样更改length
。如果我们把它变大,会发生什么?
var x = [9];
console.log(x); // [9]
x.length = 10;
console.log(x); // still [9], although length is 10 this time
// example from Red Mercury
x.forEach(function (item, index) {
console.log('Item', index, item);
});
// will print: Item 0 9
// But...
do {
console.log(x.shift());
} while(x.length > 0); // .shift() and .pop() update .length property
// will print 9 once, and nine times undefined
// probably the same with .pop(), just in reversed order

小一点?
var x = [9, 10, 14];
console.log(x); // [9, 10, 14]
x.length = 1;
console.log(x); // [9]
// example from Red Mercury
x.forEach(function (item, index) {
console.log('Item', index, item);
});
// will print: Item 0 9
// But...
do {
console.log(x.shift());
} while(x.length > 0);
// will print only 9

因此,虽然可以使用.forEach()
检查更大的长度,但较小的则不能。建议不要篡改长度值(因为.forEach()
和.shift()
开始“去同步”),但在你自己的代码中,这不应该发生在你身上。我不认为语言应该完全是防弹的,也不是可能的。 Reality最终将通过浏览器中的脚本中断来检查它,这可能会对程序员造成太多限制。如果JavaScript有适当的数组,而不仅仅是像对象这样的数组,那么它就会被阻止,但它就是它。