32

私は2つの配列を持っています、

const pets = ["dog", "cat", "hamster"]

const wishlist = ["bird", "snake"]

wishlistに追加したいのですがpets、これは 2 つの方法で実行できます。

方法 1:

pets.push.apply(pets,wishlist)

結果は次のとおりです。 [ 'dog', 'cat', 'hamster', 'bird', 'snake' ]

方法 2:

pets.push(...wishlist)

また、次の結果になります。[ 'dog', 'cat', 'hamster', 'bird', 'snake' ]

より大きなデータを処理する場合、パフォーマンスの点でこれら 2 つの方法に違いはありますか?

4

7 に答える 7

28

とスプレッド構文の両方Function.prototype.applyを大きな配列に適用すると、スタック オーバーフローが発生する可能性があります。

let xs = new Array(500000),
 ys = [], zs;

xs.fill("foo");

try {
  ys.push.apply(ys, xs);
} catch (e) {
  console.log("apply:", e.message)
}

try {
  ys.push(...xs);
} catch (e) {
  console.log("spread:", e.message)
}

zs = ys.concat(xs);
console.log("concat:", zs.length)

Array.prototype.concat代わりに使用してください。スタック オーバーフローconcatを回避することには、ミューテーションも回避できるという利点があります。突然変異は微妙な副作用を引き起こす可能性があるため、有害であると考えられています。

しかし、それはドグマではありません。関数スコープ内でミューテーションを実行してパフォーマンスを向上させ、ガベージ コレクションを軽減する場合、親スコープに表示されない限り、ミューテーションを実行できます。

于 2016-09-27T08:10:26.483 に答える
-2

ES2015 を使用している場合は、拡散演算子が最適です。拡散演算子を使用すると、他のアプローチと比較して、コードが冗長でなく、よりきれいに見えます。速度に関しては、両方のアプローチのどちらかを選択することはほとんどないと思います。

于 2016-09-27T05:22:22.120 に答える