在 javascript 中将 max 应用于大型数组时如何避免堆栈溢出?
2015-06-12
1161
以下代码
var interval = function (a, b) {
var i, list = [];
for (i = a; i <= b; i++) {
list.push(i);
}
return list;
},
xs = interval(1, 500000);
Math.max.apply(null, xs);
生成 Uncaught RangeError:超出最大调用堆栈大小。 如何克服?
请注意,间隔函数只是生成测试数据的快速方法。
我使用了 Math.max.apply 方法,因为它在此处描述: Mozilla 开发者网络
这不是一个可接受的解决方案,因为 javascript 允许函数调用的最大参数数量,感谢 Rocket Hazmat 指出这一点,请参阅他的回答了解更多信息。
underscore.js 库对 max 函数使用了一个简单的实现,我相信最合适的解决方案是在代码库中包含一个简单的 max 实现并使用它。有关更多详细信息,请参阅 @AnotherDev 的回答
2个回答
此处的问题出在这行:
Math.max.apply(null, xs);
您正在尝试调用
Math.max(1, 2, 3, 4, ..., 500000);
。JavaScript 不喜欢调用具有 500,000 个参数的函数。
有关更多信息,请参阅此答案: https://stackoverflow.com/a/22747272
gen_Eric
2015-06-12
如果您想要解决方法,可以使用 underscore.js
从 源代码 来看,它们似乎只是使用 for 循环遍历元素
for (var i = 0, length = obj.length; i < length; i++) {
value = obj[i];
if (value > result) {
result = value;
}
}
var interval = function (a, b) {
var i, list = [];
for (i = a; i <= b; i++) {
list.push(i);
}
return list;
},
xs = interval(1, 500000);
console.log(_.max(xs))
//prints 500000
tcigrand
2015-06-12