JavaScriptのインデックスは32ビットであるため、配列インデックスは4294967295まで、合計4294967296要素まで拡張できるはずです。しかし、実際には、最高のインデックスは4294967294です。配列にはlength
プロパティがあるため、最後の要素としてnullを使用する理由はわかりません。最大インデックスが4294967294であるが、4294967295ではない理由はありますか?
3 に答える
これは、Array
コンストラクターを使用して配列を作成するときにlength
、次のようにオプションを指定できるためです。
new Array(length);
配列のlength
は、32ビットの符号なし整数です。したがって、配列の長さは、から0
までの範囲である可能性がMath.pow(2, 32) - 1
あり4294967295
ます。
長さの配列の場合n
、インデックスの範囲は0
からn - 1
です。したがって、JavaScript配列の最大インデックスは(Math.pow(2, 32) - 1) - 1
またはです。Math.pow(2, 32) - 2
これは4294967294
です。
したがって、JavaScript配列は、4294967295
要素ではなく最大の要素を保持でき4294967296
ます。
知っている。それはかなり非論理的ですが、1つの要素が大きな違いを生むことはありません。
ECMA-262仕様(セクション15.4)は次のように述べています。
プロパティ名P(文字列値の形式)は、ToString(ToUint32(P))がPに等しく、ToUint32(P)が2 32 -1に等しくない場合にのみ、配列インデックスになります。
仕様にlength
は、配列のプロパティは常に232未満であるとも記載されています。これは、配列インデックスとして4294967295を除外しているように見えます。
javascript配列はを保持できます2^32-1=4294967295
。
しかし、配列インデックスはそれから始まります0
。4294967295-1=4294967294