たとえば、a [1000000]=1を実行すると; 1000000要素にメモリを使用しますか、それともこれだけにメモリを使用しますか?
4 に答える
ECMAScript 標準 (§15.4) では、配列に関する唯一の特別な点は、length
プロパティが自動的に更新されることです (および配列固有のプロトタイプ関数の束):
配列オブジェクトは、特定のクラスのプロパティ名を特別に扱います。プロパティ名P (文字列値の形式) は、P が P と等しく、かつ Pが2 32 -1と等しくない場合にのみ、配列インデックスです。 ... すべての Array オブジェクトには、値が常に 2 32未満の非負の整数であるプロパティがあります。プロパティの値は、名前が配列インデックスであるすべてのプロパティの名前よりも数値的に大きくなります。...
ToString(ToUint32(
))
ToUint32(
)
length
length
それ以外は、配列は単なるオブジェクトです。つまり、連想配列として扱うことはできませんが、そうすべきではありません。
最近では、JS エンジンは、配列が密集しているか非常に疎かを検出し、線形配列と連想配列の使用を内部で切り替える必要があります。あなたの場合、JS エンジンは 100 万個の要素を割り当てません。
1,000,000個の要素が作成されますか?
いいえ、配列はまばらですが、それらのインデックスは永続的です。編集:実際には、それらのスパース性は実装固有ですが、万が一の場合にスパース性を維持するa[1000000] = 1
ことは私には論理的なことのように思えます。
var a = [1, 2, 3, 4];
var x = a[1]; // -> x := 2
delete a[1];
var y = a[1]; // -> y := undefined
a[9] = 10;
var y = a[8]; // -> z := undefined
JSアレイは連想的ですか?
JavaScript配列は、連想配列のサブセットです(KennyTMの回答に示されているように、インデックスは整数である必要があります。JavaScriptオブジェクトは完全に連想です。
var o = { "key1": "value1", "key2": "value2" };
var i = "key2";
var v = o[i]; // -> v := "value2"
場合によっては、オブジェクトリテラルを一種の「連想aray」として使用できます。
var object = {
"first": "1",
"second": "2",
"third": "3",
"fourth": "4"
};
object.fifth = "5";
object.["sixth"] = "6";
ただし、制限があります...魔法の「長さ」パラメータはなく、すべての配列が持つメソッドにアクセスすることはできません。
JSアレイは自動拡張されます。空の配列でa[100]を1に設定すると、最初の99個の要素に「undefined」が入力されます。