var a = [1, 2, 3, 4];
var b = [5, 6, 7];
for (var x of b) {
    a.push(x);
}
// a = [1, 2, 3, 4, 5, 6, 7]

配列に配列を追加する方法は他に Array.prototype.push.apply やライブラリを使用した方法などもあると思いますが、どの方法が一番良いと思いますか?
処理速度、メモリ使用量、書きやすさなど、メリットも含め教えてください。

また、スプレッド構文を使用した

a.push(...b);

という書き方もあるようですが、これは有効な方法なのでしょうか。

2019/04/13 追記
Array.prototype.concat を使用する、という回答を頂きましたが、これは「配列に他の配列や値をつないで新しい配列を返す」というもののようです。私が求めてるものはそうではなく、既存の配列に要素を追加するものです。

a = a.concat(b)

と書けば結果は同じなのかも知れませんが、Array.prototype.concat は新しい配列を生成しますので、配列のサイズが非常に大きい場合などに(一時的な)メモリ使用量の増加や、処理速度の面でデメリットがあるのではないかと感じています。そのようなことはないのでしょうか?