ホームページ  >  に質問  >  本文

「Array.prototype.fill() は、新しいインスタンスを作成するのではなく、オブジェクトを使用して参照を渡します。」

<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>
P粉682987577P粉682987577424日前427

全員に返信(2)返信します

  • P粉878510551

    P粉8785105512023-08-24 00:43:53

    受け入れられた回答は素晴らしく、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: このフィドル でテストしました。

    返事
    0
  • P粉461599845

    P粉4615998452023-08-24 00:21:01

    まず配列に任意の値 (例: 未定義) を入力してから、map:

    を使用できます。 リーリー リーリー

    返事
    0
  • キャンセル返事