JavaScript で配列を複製する最も速い方法 - スライスと 'for' ループの比較 質問する

JavaScript で配列を複製する最も速い方法 - スライスと 'for' ループの比較 質問する

JavaScript で配列を複製するには、次のどれを使用するのが速いでしょうか?

Slice方法

var dup_array = original_array.slice();

Forループ

for(var i = 0, len = original_array.length; i < len; ++i)
   dup_array[i] = original_array[i];

どちらの方法も浅いコピーのみを行うことはわかっています。オブジェクトへの参照が含まれている場合original_array、オブジェクトは複製されず、参照のみがコピーされるため、両方の配列に同じオブジェクトへの参照が含まれます。ただし、これはこの質問のポイントではありません。

速度についてのみ質問しています。

ベストアンサー1

配列を複製する方法は少なくとも6 つあります。

  • ループ
  • slice
  • Array.from()
  • concat
  • スプレッド構文(最速)
  • 地図A.map(function(e){return e;});

大きな出来事がありましたベンチマークスレッド以下の情報を提供します:

  • blinkブラウザの場合はslice()最も速い方法ですが、concat()少し遅く、while loop2.4 倍遅くなります。

  • 他のブラウザではとwhile loopの内部最適化が行われていないため、 を使用するのが最も高速な方法です。sliceconcat

これは 2016 年 7 月でも当てはまります。

以下は、ブラウザのコンソールにコピーして貼り付け、数回実行して画像を表示できる簡単なスクリプトです。出力はミリ秒単位で、短いほど良いです。

whileループ

n = 1000*1000;
start = + new Date();
a = Array(n); 
b = Array(n); 
i = a.length;
while(i--) b[i] = a[i];
console.log(new Date() - start);

スライス

n = 1000*1000;
start = + new Date();
a = Array(n); 
b = a.slice();
console.log(new Date() - start);

これらのメソッドは配列オブジェクト自体を複製しますが、配列の内容は参照によってコピーされ、ディープクローン化されないことに注意してください。

origAr == clonedArr //returns false
origAr[0] == clonedArr[0] //returns true

おすすめ記事