我尝试向数组添加min()和max()函数,使用...运算符实现:
Array.prototype.min = Array.prototype.min || function () {
return Math.min(...this);
};
Run Code Online (Sandbox Code Playgroud)
但是,在大型数组上调用这些函数时,出现异常:“RangeError:超出最大调用堆栈大小”。到底是怎么回事?
console.log(new Array(100000).min()); /* works */
console.log(new Array(1000000).min()); /* error */
Run Code Online (Sandbox Code Playgroud)
我想你经历过 stackOverFlow。浏览器为 Javascript 调用堆栈分配有限的内存。正如 @Pointy 在评论中提到的,您尝试传递 100 万个参数。虽然您的代码可能很短,但它相当于:
const arr = new Array(1000000)
Math.min(arr[0], arr[1], arr[2] ... arr[100,000] ... arr[999,999])
Run Code Online (Sandbox Code Playgroud)
你的 JS 环境无法处理它是有道理的。
/sf/answers/940858971/提到了这个问题,并简单地建议迭代数组以找到最小的。
也许更有效的解决方案是构建一个专用函数,将数组划分为环境可以处理的更小的组。找到每组的最小值后,最小值中的最小值就是整个组的最小值。
顺便说一句,我建议不要污染数组原型。我知道Find the min/max element of an Array in JavaScript(和其他答案)推荐它,但污染 Array 的原型并不安全,因为您可能会影响第三方库。
| 归档时间: |
|
| 查看次数: |
2614 次 |
| 最近记录: |