14

JavaScript 的索引是 32 位的,所以看起来数组索引应该能够达到 4294967295,总共 4294967296 个元素。但实际上最高索引是 4294967294。由于数组具有length属性,所以我看不出将 null 作为最后一个元素的原因。最大索引是 4294967294 但不是 4294967295 是否有原因?

4

3 回答 3

14

这是因为当您使用构造函数创建数组时,Array您可以为它提供一个可选length参数,如下所示:

new Array(length);

length数组的 是一个 32 位无符号整数。因此,数组的长度范围可能从0Math.pow(2, 32) - 14294967295

对于长度数组,n索引范围从0n - 1。因此,JavaScript 数组的最大索引是(Math.pow(2, 32) - 1) - 1Math.pow(2, 32) - 2,即4294967294

因此,一个 JavaScript 数组可能包含最多的4294967295元素而不是4294967296元素。

我知道。这很不合逻辑,但是再一次,一个元素不会有太大的不同。

于 2012-10-07T05:57:51.370 回答
5

ECMA-262 规范(第15.4 节)说:

当且仅当 ToString(ToUint32( P )) 等于P且 ToUint32( P ) 不等于 2 32 -1时,属性名称P(以字符串值的形式)是数组索引。

规范还说length数组的属性总是小于2 32。这似乎将 4294967295 作为数组索引排除在外。

于 2012-10-07T06:11:33.653 回答
0

javascript 数组可以容纳2^32-1=4294967295.
但是数组索引从那开始04294967295-1=4294967294

于 2012-10-07T05:48:31.417 回答