我對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謝謝你,如果你寫這個答案我會接受它。當你達到那個長度時會發生什麼?口譯員只是抱怨你,不讓你更新數組? –