JavaScript 数组变得非常大时会丢失浮点精度?

Loss of floating-point precision in JavaScript arrays as they get really large?

我对JavaScript比较陌生,最近听说一个JavaScript数组包含一个length类型的Number变量。当数组更新为数组中的元素数时,此长度会自动更新。

然而,我也被告知,在内部,JavaScript 对其 Number class 使用 64 位浮点表示。我们知道浮点运算不能精确表示其范围内的所有整数。

所以我的问题是,length + 1 不能准确表示序列中的下一个最大整数的大数组会怎样?

根据this,数组的最大长度是4,294,967,295Number.MAX_SAFE_INTEGER9,007,199,254,740,991,所以您不必担心,因为引擎不会让您走那么远,例如:

new Array(4294967296); // RangeError: Invalid array length

spec的相关部分:

  1. c. Let newLen be ToUint32(Desc.[[Value]]).
    b. If newLen is not equal to ToNumber( Desc.[[Value]]), throw a RangeError exception

所以给定我们的示例长度 4294967296:

var length = 4294967296;
var int32length = length >>> 0; // Convert to int32
int32length === 0; // Can't represent this as int32
length !== int32length; // Therefore RangeException

由于 ToUint32 抽象操作,根据 ECMA-262 第 5 版规范,数组的最大长度受无符号 32 位整数约束,因此可能的最长数组可能有 232-1 = 4,294,967,295 = 4.29亿元素。这是根据 Maximum size of an Array in Javascript..

所以我猜@RGraham 是对的