Javascript 铬:如何解决;超过最大调用堆栈大小;Math.max.apply(数学,数组)上的错误

Javascript 铬:如何解决;超过最大调用堆栈大小;Math.max.apply(数学,数组)上的错误,javascript,google-chrome,optimization,Javascript,Google Chrome,Optimization,我必须找到非常大的数组的最大值和最小值。我用这个 Math.max.apply(Math, my_array); Math.min.apply(Math, my_array); 它在Firefox和IE上运行得很好,但在Chrome上,我总是得到超过最大调用堆栈大小的错误。。。我当前的数组有221954个元素,这不是我最大的数组 有人知道如何在Chrome上解决这个错误吗?如何优化最大值和最小值的搜索 对于那些不相信的人,请在Chrome控制台中尝试以下内容: var xxx = [] for

我必须找到非常大的数组的最大值和最小值。我用这个

Math.max.apply(Math, my_array);
Math.min.apply(Math, my_array);
它在Firefox和IE上运行得很好,但在Chrome上,我总是得到
超过最大调用堆栈大小的错误。。。我当前的数组有221954个元素,这不是我最大的数组

有人知道如何在Chrome上解决这个错误吗?如何优化最大值和最小值的搜索

对于那些不相信的人,请在Chrome控制台中尝试以下内容:

var xxx = []
for(var i=0; i<300000; i++){
    xxx.push(Math.random());
}
Math.max.apply(Math, xxx);
var xxx=[]

对于(var i=0;i RangeError:最大调用堆栈大小超过了

对我来说,错误不应该来自对Math.min/max的调用,它看起来像是使用递归的结果,我无法相信Chrome会使用递归来实现这些函数

它们是否嵌入到递归代码中

您可以轻松地滚动自己的最小/最大代码,以避免Chrome中的问题。

var a=[];
var a=[]; 
for(var i=0;i<1125011;i++){ 
    a[i] = i;
}
function maxIterate(arr){
    var max = arr[0];
    for(var i = 1;i< arr.length; i++){
        (max < arr[i]) && (max = arr[i])
    }
    return max;
}
console.log(maxIterate(a));

对于(var i=0;i您正在达到函数参数大小限制。它是OK。 函数应该只接受几个参数,因为其他参数是代码气味

如果您有一组项目?-使用数组。您正在使用通过的
.apply()
比如:
fun(1,2,3,4,5,6…)
并达到极限。这是一种糟糕的做法


问题是-
Math.max()
只能这样工作,因此最好的选择是迭代搜索函数。但这是另一个主题,因为性能和算法可能会有所不同,例如,如果您首先对数组排序。

此问题与Math.max和Math.min没有任何关系

Function.prototype.apply只能接收长度有限的数组作为其第二个参数

在本地,我使用Chrome进行了测试:

function limit(l) {
  var x = []; x.length = l;
  (function (){}).apply(null, x);
}
在本地,极限(l)正好以l=124980崩溃。在金丝雀,这是另一个数字,但也是~125k

这是一个解释为什么会发生这种情况的示例:(在其他JS引擎中也可以重复,例如MDN提到了这个问题:(以“但是小心…”开头),在WebKit bugzilla中指出了这个问题:)。据我所知,为什么在V8中抛出RangeError:

V8在汇编中实现Function.prototype.apply。在调用函数之前,它应该在调用javascript函数之前将所有函数调用参数(例如thisArg)和第二个arg数组的所有成员逐个放置到堆栈上。但是堆栈的容量有限,如果达到该限制,则会出现RangeError

这是我在V8源代码(IA-32 assembly,builtins-ia32.cc)中发现的:

请检查!!添加注释以解释我如何理解它

这是APPLY_OVERFLOW函数,用JS编写(同样是V8源代码,runtime.JS):

编辑:在您的情况下,我想:

var max = -Infinity; 
for(var i = 0; i < arr.length; i++ ) if (arr[i] > max) max = arr[i];
var max=-无穷大;
对于(var i=0;imax)max=arr[i];

你可能想看看这个问题:我看到了。从那里我复制了我的两行。但是我的问题没有什么…试着向下滚动:这个答案在FF中效果很好,但在chrome中会崩溃…使用这个时,我会遇到很多jQuery错误!顺便说一句:他们提到只有在有~10行时才需要使用这个⁷ 元素,但我之前有一个问题:/On Chrome这对我很有用:
for(var a=[],I=0;I<99999;++I)a[I]=Math.random()+1;a.min();
无论如何,问题与Function.prototype.apply有关-试试这个:
for(var a=[],i=0;我在Chrome中调试时,它总是停在“Math.max.apply”这一行,我也不敢相信,但这是事实……我在这段代码中没有任何递归。这两行是在一个只调用一次的init函数中。什么?(maxfunction max(arr){return Math.max.apply(null,arr);}
function APPLY_OVERFLOW(length) {
  throw %MakeRangeError('stack_overflow', []);
}
var max = -Infinity; 
for(var i = 0; i < arr.length; i++ ) if (arr[i] > max) max = arr[i];