关于javascript:如何以变异的方式在JS中连接数组?

How to concat arrays in JS in mutating way?

本问题已经有最佳答案,请猛点这里访问。

在JS中,以可变方式连接数组的最佳方法是什么?我的问题:

1
2
3
4
5
var a = [1,2,3]
var b = a;
a = a.concat([4,5,6]) //<-- typical way of array concatenation in JS
console.log(a) //[1,2,3,4,5,6]
console.log(b) //[1,2,3] <-- I'd like it to be the same like a here

当然,我可以使用一些循环,但我想知道是否有更快更干净的方法来实现它。


push改变了一个数组,但它需要一系列参数,因此我们使用apply来:

1
2
3
4
5
var a = [1,2,3]
var b = a
a.push.apply(a, [4,5,6])
console.log(a) //=> [1, 2, 3, 4, 5, 6]
console.log(b) //=> [1, 2, 3, 4, 5, 6]

在ES6中,您可以使用排列运算符...

1
a.push(...[4, 5, 6])


您可以使用这样一个事实:push可以接受数量可变的参数,并将所有参数推送到数组的末尾。然后你可以写:

1
a.push.apply(a, [1, 2, 3]);

因为apply将把参数数组转换成函数的参数列表。


您可以在这里使用push.apply更新a而不创建新的变量:

1
a.push.apply(a, [4,5,6]);

或者更容易理解:

1
Array.prototype.push.apply(a, [4,5,6]);

演示

简而言之,apply调用函数push,第一个参数设置为this(对象上下文),第二个参数设置为数组。例如,它相当于a.push(element1, ..., element10)


您可以将"a"保留为属性,以便可以通过引用访问它:

1
2
3
4
5
6
7
var myObj = {};
myObj.a = [1,2,3]
var b = myObj;
myObj.a = myObj.a.concat([4,5,6])

console.log(myObj.a);
console.log(b.a);