Answers:
当使用带有apply或的对象的大多数功能时call,context参数必须是您正在处理的对象。
在这种情况下,您需要a.push.apply(a, [1,2])(或更正确地说Array.prototype.push.apply(a, [1,2]))
您可以通过以下方式将多个元素推入数组
var a = [];
a.push(1, 2, 3);
console.log(a);
您可以使用Array.concat:
var result = a.concat(b);
Array.prototype.push.apply(arr1, arr2)正确的答案是,因为使用arr1.concat(arr2)来创建新阵列。
arr1 = arr1.concat(arr2)没什么大不了,看起来更干净。推入旧阵列或用新阵列替换旧阵列取决于您的需求。如果处理10m +个元素,则推入旧数组的速度会更快,如果管理小的块,则几乎看不到速度上的任何差异。两种选择都是完全合法的。
prototype.push.apply只打push一次。上面的区别在速度上不是必需的,而是就地操作与创建新数组的区别。如果我有一个采用数组并应该就地修改的方法该怎么办?concat即使使用VisionN的代码,该方法也可能无法工作,因为它不会为函数调用者修改变量。
a = a.concat(b)语法仍然比Array.prototype.push.apply(arr1, arr2)
如果您想要Array.concatECMAScript 2015(又名ES6,ES2015)的替代方案,就像它一样,它不会修改数组而是返回一个新数组,则您可以使用散布运算符,如下所示:
var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);
请注意,这与push方法不同,因为该push方法会更改/修改数组。
如果要查看某些ES2015功能在浏览器中是否可用,请检查Kangax的兼容性表。
如果不想等待浏览器支持并想在生产环境中使用ES2015,也可以使用Babel或类似的编译器。
建议使用许多答案:Array.prototype.push(a, b)。很好,但是如果您的b很大,则会出现堆栈溢出错误(由于参数过多)。小心点
请参见连接N个数组的最有效方法是什么?更多细节。
var a=[];
a.push({
name_a:"abc",
b:[]
});
a.b.push({
name_b:"xyz"
});