高级JavaScript数组连接-性能
我正在尝试两种不同的方法来连接两个阵列,并使用巨大的阵列来判断它们的性能,但我在第二种选择上遇到了一个错误,我不明白为什么 我首先用10000000个元素填充这两个元素,这些元素的值等于它们的索引高级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; }
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)