性能
我分析了当前的解决方案,并提出了2个新的(F和G在详细部分提出)一个是非常快的中小型阵列
今天2020.11.13我在Chrome v86、Safari v13.1.2和Firefox v82上对所选解决方案的MacOs HighSierra 10.13.6进行测试
结果
适用于所有浏览器
对于中小型数组,基于while-pop-unshift (F,G)的解决方案在所有浏览器上(非常)最快。对于有50000个元素的数组,这个解决方案在Chrome上变慢
解决方案C,D数组500000中断:“RangeError:最大调用堆栈大小超过
解(E)最慢
细节
我执行2个测试用例:
当数组有10个元素时,你可以在这里运行它
当数组有10k个元素时-你可以在这里运行它
下面的代码片段展示了解决方案之间的差异
一个,
B,
C,
D,
E,
F(我)
G(我)
H,
我
// https://stackoverflow.com/a/4156145/860099
function A(a,b) {
return a.concat(b);
}
// https://stackoverflow.com/a/38107399/860099
function B(a,b) {
return [...a, ...b];
}
// https://stackoverflow.com/a/32511679/860099
function C(a,b) {
return (a.push(...b), a);
}
// https://stackoverflow.com/a/4156156/860099
function D(a,b) {
Array.prototype.push.apply(a, b);
return a;
}
// https://stackoverflow.com/a/60276098/860099
function E(a,b) {
return b.reduce((pre, cur) => [...pre, cur], a);
}
// my
function F(a,b) {
while(b.length) a.push(b.shift());
return a;
}
// my
function G(a,b) {
while(a.length) b.unshift(a.pop());
return b;
}
// https://stackoverflow.com/a/44087401/860099
function H(a, b) {
var len = b.length;
var start = a.length;
a.length = start + len;
for (var i = 0; i < len; i++ , start++) {
a[start] = b[i];
}
return a;
}
// https://stackoverflow.com/a/51860949/860099
function I(a, b){
var oneLen = a.length, twoLen = b.length;
var newArr = [], newLen = newArr.length = oneLen + twoLen;
for (var i=0, tmp=a[0]; i !== oneLen; ++i) {
tmp = a[i];
if (tmp !== undefined || a.hasOwnProperty(i)) newArr[i] = tmp;
}
for (var two=0; i !== newLen; ++i, ++two) {
tmp = b[two];
if (tmp !== undefined || b.hasOwnProperty(two)) newArr[i] = tmp;
}
return newArr;
}
// ---------
// TEST
// ---------
let a1=[1,2,3];
let a2=[4,5,6];
[A,B,C,D,E,F,G,H,I].forEach(f=> {
console.log(`${f.name}: ${f([...a1],[...a2])}`)
})
这里是chrome的示例结果