「Array.prototype.fill() は、新しいインスタンスを作成するのではなく、オブジェクトを使用して参照を渡します。」
P粉682987577
2023-08-23 09:15:17
<p>私は少し遊んで、長さ <code>x</code> の新しい配列をインスタンス化しようとしました。ここで、配列のすべての要素は値 <code>y</code> に初期化されます。 < /p>
<pre class="brush:php;toolbar:false;">var arr = new Array(x).fill(y);</pre>
<p>このメソッドは、<code>y</code> の値が <strong>オブジェクト</strong> ではない場合にうまく機能します。
つまり、<code>y</code> がオブジェクトの場合、次の条件が真になります。
<pre class="brush:php;toolbar:false;">var arr = new Array(2).fill({});
arr[0] === arr[1]; //結果は true です。
arr[0].test = '文字列';
arr[1].test === 'string'; //結果も true;</pre>
<p>fill 関数を使用するときに、要素ごとに新しいオブジェクトを作成する必要があることを宣言する方法はありますか?それともループに変換する必要がありますか? </p>
受け入れられた回答は素晴らしく、90% の確率で機能します。
ただし、高パフォーマンスの JS アプリケーションを作成していて、大規模な配列を使用している場合、Array.map(..) はメモリとプロセッサの使用量の点で多くの負荷を生じます。配列のコピーが作成されるためです。
従来の for ループを使用することをお勧めします:
リーリー6 つの代替案をテストしたところ、次の結果が得られました:
Array.map()、上記と同様 (元のものより 11 倍遅い!
):for ループ
、最良の選択 (最速):forEach (6 倍低速):
リーリー[2020-08-27更新]イリアス・カリム氏が別の方法を提案しました
Array.from (30 倍遅い! ) - 最高の構文にもかかわらず、パフォーマンスの点では明らかに劣ります:(
リーリー[..Array(..)] (5 倍遅い!)
リーリーArray.push(..)、パフォーマンスの点で 2 位にランクされています (2 倍遅い! )
リーリーPS: このフィドル でテストしました。
まず配列に任意の値 (例:
を使用できます。 リーリー リーリー未定義
) を入力してから、map
: