如何找出Javascript数组中的元素数量?

时间:2016-09-10 00:27:32

标签: javascript arrays

在ECMAScript规范中,array.length未定义为数组中元素的数量。

http://www.ecma-international.org/ecma-262/6.0/#sec-properties-of-array-instances-length

  

Array实例的length属性是一个data属性,其值始终在数字上大于名称为数组索引的每个可配置的属性的名称。

也就是说,Javascript引擎可能会导致array.length在所有情况下都为正无穷大,并且符合标准。

考虑到这一点,我应该如何计算数组中的元素?

3 个答案:

答案 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有适当的数组,而不仅仅是像对象这样的数组,那么它就会被阻止,但它就是它。