我对JavaScript并不陌生,最近我被告知JavaScript数组包含Number
类型的length
变量。当数组更新为数组中元素的数量时,该长度会自动更新。JavaScript数组中浮点精度的损失,因为它们变得非常大?
但是,我还被告知,在内部,JavaScript为其Number
类使用了64位浮点表示法。我们知道浮点算术不能完全表示其范围内的所有整数。
所以我的问题是,大数组会发生什么,其中length + 1
不能准确地表示序列中下一个最大的整数?
我对JavaScript并不陌生,最近我被告知JavaScript数组包含Number
类型的length
变量。当数组更新为数组中元素的数量时,该长度会自动更新。JavaScript数组中浮点精度的损失,因为它们变得非常大?
但是,我还被告知,在内部,JavaScript为其Number
类使用了64位浮点表示法。我们知道浮点算术不能完全表示其范围内的所有整数。
所以我的问题是,大数组会发生什么,其中length + 1
不能准确地表示序列中下一个最大的整数?
根据this,Array的最大长度为4,294,967,295
。 Number.MAX_SAFE_INTEGER
是9,007,199,254,740,991
所以你不必担心,因为引擎不会让你走到这一步,例如:
new Array(4294967296); // RangeError: Invalid array length
的spec的有关部分:
- c。假设newLen是ToUint32(描述[[Value]])。 b。如果newLen不等于ToNumber(品名[价值]]),引发RangeError异常
所以考虑到我们的例子长度4294967296
:
var length = 4294967296;
var int32length = length >>> 0; // Convert to int32
int32length === 0; // Can't represent this as int32
length !== int32length; // Therefore RangeException
非常感谢! –
@ Shaktal不客气。这似乎是对的,但有更多JS内部知识的人可能会证明我错了! – CodingIntrigue
这似乎是合乎逻辑的,我会在接受确认之前等一会儿! –
的最大长度根据ECMA-262第5版规范的数组由于ToUint32抽象操作而被无符号的32位整数约束,所以最长可能的数组可能具有232-1 = 4,294,967,295 = 42.9亿个元素。这是根据本Maximum size of an Array in Javascript ..
所以我想@RGraham是右
根据[此](http://stackoverflow.com/questions/6154989/maximum-size-of-an-array-in -javascript)数组的最大长度是'4,294,967,295'。 'Number.MAX_SAFE_INTEGER'是'9,007,199,254,740,991',所以你不必担心,因为引擎不会让你得到那么多 – CodingIntrigue
@Rraham谢谢你,如果你写这个答案我会接受它。当你达到那个长度时会发生什么?口译员只是抱怨你,不让你更新数组? –