关于js中数组连接的问题——concat和push.apply

本文探讨了JavaScript中数组连接的几种方法,包括使用`concat`、`push`以及`Array.prototype.push.apply`。`concat`返回连接后的数组副本而不改变原数组,而`push`仅在数组末尾添加元素。对于复杂合并,`Array.prototype.push.apply`通过`apply`方法展开数组元素并合并,但在处理大数组时可能导致异常。推荐在可能的情况下使用`forEach`以提高性能和避免异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

concat

数组连接一般的方法就是JS数组内置的concat方法。

var oldArr = [];
var arr = [1, 2, 3];
var newArr = oldArr.concat(arr);
console.log(oldArr);//[]
console.log(newArr);//[1, 2, 3]

通过上面的例子我们发现arr.concat方法进行连接是没有改变原数组的,而是申请了一块新的区域进行存储,返回的是连接后数组的一个副本。

push

如果使用push的话只是单纯的添加在数组后面。

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

[].push.apply

apply() 方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。用到这里,可以把 elements数组 展开,然后一个一个 push 到 array数组 中去,并且只能两个数组之间发生合并。

var array = ['a', 'b'];
var elements = [0, 1, 2];
[].push.apply(array, elements);
console.log(array); // ["a", "b", 0, 1, 2]
a = new Array();
b = new Array(125624);                    
a.push.apply(a, b);

以上的代码在chrome下抛出了如下的异常:

Uncaught RangeError: Maximum call stack size exceeded

如果把数组改为b = new Array(125623);小一个元素就好了,其他浏览器也都有大数组才出错的问题,但不同浏览器临界值还各异。

如果遇到这种情况,给出的建议是老老实实用forEach,不仅可以避免大数组的异常问题,并且从性能角度考虑forEach也是最快的。
详情见:https://www.jb51.net/article/50831.htm

Array.prototype.push.apply

理论上Array.prototype.push比[].push要快. 因为[].push这种方式需要在原型链上查找两次才能捕获到push方法.
实际从使用上来说没有太大差异。本质上也是调用[].__proto__也就是Array.prototype上的push函数,除了会创建一个数组对象以外没有不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值