高い値で始まる配列がある場合、JS配列でメモリがどのように処理されるかを知っている人はいないかと思いました。
たとえば、次の場合:
array[5000] = 1;
配列の最初の値として、5000より前のすべては単に存在しません。配列に割り当てられたメモリの量は、それより前の割り当てられていない4999の位置に対応しますか、または配列の値にのみメモリを割り当てます。 [5000]?
スクリプトに使用されるメモリの量を削減しようとしているので、この質問について疑問に思いました:)
高い値で始まる配列がある場合、JS配列でメモリがどのように処理されるかを知っている人はいないかと思いました。
たとえば、次の場合:
array[5000] = 1;
配列の最初の値として、5000より前のすべては単に存在しません。配列に割り当てられたメモリの量は、それより前の割り当てられていない4999の位置に対応しますか、または配列の値にのみメモリを割り当てます。 [5000]?
スクリプトに使用されるメモリの量を削減しようとしているので、この質問について疑問に思いました:)
thキーに値を割り当てる場合、5000
配列全体が入力されるわけではありません。
var array = []; // Create array
array[5000] = 1;
'1' in array; // false: The key does not exists
Object.keys(array); // 5000 (it's the only key)
新しいブラウザに配列を追加する場合は、型指定された配列を入力します。
var array = new ArrayBuffer(6e9); // 6 Gigs
どちらもChromeで簡単に確認できます。コンソールとメモリコンソール(Shift + Esc)を開き、コードを貼り付けます。window.a=new Array(6e9);
または、ページ
をクラッシュさせてもwindow.a=[];window[6e9]=1;
、メモリが大幅に増加することはありません。window.a=new ArrayBuffer(6e9);
PS。6e9 === 6000000000
Javascriptは実際にはブラウザによって解釈および実行されるため、ブラウザがこの動作をどのように実装するかによって異なります。理論的には、array [5000]を実行すると、5001の要素の配列が作成されますが、5001番目の要素は未定義です。
私がそのようなスクリプトを実行するためのロジックを実装しているundefined
場合でも、他に割り当てられていない場合はデフォルト値になります。つまり、キー5000を値1に割り当てる1つのエントリでマップを定義することで回避できる可能性があります。配列内の他の値は、不要な作業を行うことなく、自動的に未定義を返します。
これがここでのテストです。ご覧のとおり、アラートはすぐに表示されます。
JS配列は、C、C ++などの他のプログラミング言語から知っているように、実際には配列ではありません。代わりに、それらにアクセスする方法のような配列を持つオブジェクトです。これは、定義するときに、array[5000] = 1;
実際に配列オブジェクトの5000プロパティを定義することを意味します。
配列キーとして文字列を使用した場合、この動作を示すためにプロパティとしてインデックスにアクセスすることもできますが、変数名は数字で始めることができないため、array.5000
無効になります。
array['key'] = 1;
alert( array.key ); // Gives you 1
これは、配列はおそらくオブジェクトのように実装されることを意味しますが、各実装は自由に最適化できるため、アルファベット全体を定義せずに定義object.a
できるオブジェクトを除いて、動作を提供します。object.z