2015-07-03 25 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是右