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 loop
2.4 倍遅くなります。他のブラウザではと
while loop
の内部最適化が行われていないため、 を使用するのが最も高速な方法です。slice
concat
これは 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