RangeError:使用Array.forEach超出了最大调用堆栈大小
RangeError: Maximum call stack size exceeded using Array.forEach
src/QuickSort.js
var quick_sort = function(unsorted) {
if (unsorted.size <= 1)
return unsorted;
var pivot = unsorted.pop();
var less = new Array();
var greater = new Array();
unsorted.forEach(function(element){
if (element > pivot)
less.push(element);
else
greater.push(element);
});
return quick_sort(less) + [pivot] + quick_sort(greater);
};
spec/QuickSort.js
describe("#quick_sort", function() {
it("should sort the unsorted array", function() {
var unsorted = [8, 2, 10, 5, 4, 9, 7, 1, 6, 3];
var sorted = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
expect(quick_sort(unsorted)).toEqual(sorted);
});
});
错误消息
RangeError: Maximum call stack size exceeded
at Array.forEach (native)
at quick_sort (file://localhost/Users/jasonkim/projects/algorithm-everyday/quick_sort/javascript/src/QuickSort.js:9:12)
at quick_sort (file://localhost/Users/jasonkim/projects/algorithm-everyday/quick_sort/javascript/src/QuickSort.js:16:10)
我正在尝试使用jasminejs测试快速排序函数。我得到了上面的错误。我有if (unsorted.size <= 1) { return unsorted }
以上的终止条件。我不知道为什么它没有终止并进入无限循环。
您的问题是线路
if (unsorted.size <= 1)
return unsorted;
由于Arrays没有名为CCD_ 3的原型属性,因此,当unsorted
为空,因此进入无限循环时,您不会返回Array,使用空的unsorted
调用quick_sort
,直到调用堆栈耗尽。
如果您想将线路更改为,您要查找的属性是Array.prototype.length
if (unsorted.length <= 1)
return unsorted;
如果函数传递了一个空数组,那么它将正确返回。
然而,也有一件小事值得注意,那就是
return quick_sort(less) + [pivot] + quick_sort(greater);
如果您希望返回一个串联的排序数组,那么您也必须更改这一行。
您不能简单地使用+
运算符来连接数组,该运算符调用
lRef
和rRef
上的[[toPrimitive]]
和[[toString]]
生成数组的串联字符串表示。
这将(因为您有效地使用了+
'所有的枢轴数组,包含一个元素)在类似10987654321
的东西中,而不是[10,9,8,7,6,5,4,3,2,1]
,您可以实现什么。
相反,使用连接数组的Array.prototype.concat
。
return quick_sort(less).concat([pivot]).concat(quick_sort(greater));
这是一个Fiddle
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 超过了async.detect最大调用堆栈大小
- 如何远程检查JavaScript应用程序的函数调用堆栈
- 超过了最大调用堆栈大小,循环无限
- 超过了最大调用堆栈大小.递归标签
- 日志:未捕获的范围错误:超过了最大调用堆栈大小
- 未捕获的范围错误:setTimeout()超过了最大调用堆栈大小
- JavaFX+WebView/Javascript:setTimeOut不起作用调用堆栈来自Java
- JavaScript继承:未捕获的范围错误:超过了最大调用堆栈大小
- 使用$cookies和$stateChangeStart检查sessionID是否超过了最大调用堆栈
- jQuery捕获"RangeError:超过了最大调用堆栈大小“;
- 设置这个.RangeError:超过了最大调用堆栈大小
- 收到“范围错误: 超出最大调用堆栈大小”错误
- 递归 - 测试最大堆栈大小时,调用堆栈无法弹出
- 轮询 ajax 函数超出调用堆栈
- Chrome RangeError:使用jQuery$.map时超过了最大调用堆栈大小
- 要求JS 2.1.9引起“;最大调用堆栈"使用Grunt时出错
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 超过了最大调用堆栈大小-没有明显的递归
- 警告:字体加载过程中出错:轨道上的PDFJS超过了最大调用堆栈大小错误