1. ホーム
  2. javascript

[解決済み] JavaScriptで配列を複製する最速の方法 - スライス vs. 'for'ループ

2022-03-14 08:09:47

質問

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];


私は両方の方法を知っている唯一のaを行う。 シャローコピー : もし original_array がオブジェクトへの参照を含んでいる場合、オブジェクトは複製されませんが、参照だけがコピーされます。したがって、両方の配列が同じオブジェクトへの参照を持つことになります。 しかし、これはこの質問のポイントではありません。

スピードのことだけを聞いているんです。

解決方法は?

少なくとも 6 (!) 配列をクローンする方法です。

  • ループ
  • スライス
  • Array.from()
  • コンカット
  • スプレッド演算子(FASTEST)
  • 地図 A.map(function(e){return e;});

を、より多くの人に知ってもらうために ベンチマークススレッド を提供し、以下の情報を提供します。

  • について ブリンク ブラウザー slice() が最速の方法です。 concat() は少し遅く、そして while loop は2.4倍遅い。

  • 他のブラウザの場合 while loop は最速の方法です。これらのブラウザは sliceconcat .

2016年7月現在も同様です。

以下は、ブラウザのコンソールにコピーペーストして何度か実行することで、その様子を確認できる簡単なスクリプトです。出力はミリ秒単位で、小さいほど良い。

間ループ

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);

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

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