2015-07-03 65 views
3

我对JavaScript并不陌生,最近我被告知JavaScript数组包含Number类型的length变量。当数组更新为数组中元素的数量时,该长度会自动更新。JavaScript数组中浮点精度的损失,因为它们变得非常大?

但是,我还被告知,在内部,JavaScript为其Number类使用了64位浮点表示法。我们知道浮点算术不能完全表示其范围内的所有整数。

所以我的问题是,大数组会发生什么,其中length + 1不能准确地表示序列中下一个最大的整数?

+0

根据[此](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

+0

@Rraham谢谢你,如果你写这个答案我会接受它。当你达到那个长度时会发生什么?口译员只是抱怨你,不让你更新数组? –

回答

5

根据this,Array的最大长度为4,294,967,295Number.MAX_SAFE_INTEGER9,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 
    
    +0

    非常感谢! –

    +2

    @ Shaktal不客气。这似乎是对的,但有更多JS内部知识的人可能会证明我错了! – CodingIntrigue

    +2

    这似乎是合乎逻辑的,我会在接受确认之前等一会儿! –

    0

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

    所以我想@RGraham是右