高级JavaScript数组连接-性能

高级JavaScript数组连接-性能,javascript,arrays,performance,performance-testing,Javascript,Arrays,Performance,Performance Testing,我正在尝试两种不同的方法来连接两个阵列,并使用巨大的阵列来判断它们的性能,但我在第二种选择上遇到了一个错误,我不明白为什么 我首先用10000000个元素填充这两个元素,这些元素的值等于它们的索引 var arr1 = []; var arr2 = []; for (var i = 0; i < 10000000; i++) { arr1[i] = i; } for (var i = 0; i < 10000000; i++) { arr2[i] = i; }

我正在尝试两种不同的方法来连接两个阵列,并使用巨大的阵列来判断它们的性能,但我在第二种选择上遇到了一个错误,我不明白为什么

我首先用10000000个元素填充这两个元素,这些元素的值等于它们的索引

var arr1 = [];
var arr2 = [];
for (var i = 0; i < 10000000; i++) {
    arr1[i] = i;
} 
for (var i = 0; i < 10000000; i++) {
    arr2[i] = i;
}

但选项2会引发以下错误:

Array.prototype.push.apply(arr1, arr2);
错误:

/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:12
Array.prototype.push.apply(arr1, arr2);
                     ^

RangeError: Maximum call stack size exceeded
    at Object.<anonymous> (/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:12:22)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Function.Module.runMain (module.js:467:10)
    at startup (node.js:136:18)
    at node.js:963:3
我仍然得到:

/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:16
    Array.prototype.push.apply(arr1, arr2);
                         ^

RangeError: Maximum call stack size exceeded
    at null._onTimeout (/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:16:23)
    at Timer.listOnTimeout (timers.js:92:15)

apply()
方法将提供的数组展开到参数列表。ECMAScript规范本身对函数的参数数量没有限制,但大多数JS引擎都有实现特定的限制,因为它们对内部堆栈上的每个函数调用使用固定或有限大小的结构,以提高性能。虽然此限制通常相当高,但它肯定远低于10000000个参数,这就是为什么会出现错误“超出最大调用堆栈大小”。

“RangeError:超出最大调用堆栈大小”-您的问题是什么?堆栈溢出。您在一瞬间完成了Javascript所能完成的大部分工作。尝试执行
setTimeout(函数(){Array.prototype.push.apply(arr1,arr2);},0)并查看是否helps@vtange我编辑了这个问题以反映你所说的。为什么我仍然会犯这个错误?在选项1中没有得到它?你的问题是?@OlegV.Volkov如果我在第二个选项中得到调用堆栈错误,为什么我在第一个选项中没有得到它?
setTimeout(function () {
    Array.prototype.push.apply(arr1, arr2);
}, 0);
/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:16
    Array.prototype.push.apply(arr1, arr2);
                         ^

RangeError: Maximum call stack size exceeded
    at null._onTimeout (/private/var/folders/j6/3fs5_k3n17z_0j2xrwj6sphw0000gn/T/CodeRunner/Untitled 9.js:16:23)
    at Timer.listOnTimeout (timers.js:92:15)