RangeError:使用Array.forEach超出了最大调用堆栈大小

RangeError: Maximum call stack size exceeded using Array.forEach

本文关键字:调用 堆栈 使用 Array forEach RangeError      更新时间:2023-09-26

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);

如果您希望返回一个串联的排序数组,那么您也必须更改这一行。

您不能简单地使用+运算符来连接数组,该运算符调用

lRefrRef上的[[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