列表操作导致无限循环

时间:2016-02-18 21:31:23

标签: javascript arrays infinite-loop

我正在尝试在Ionic Framework中创建一个用于列表目的的数组,并检查所有callcenter名称的第一个char,将它们添加到字母数组中。

  for (var i = 0; i < callcenterList.length; i++) {
    var value = callcenterList[i]._owner && callcenterList[i]._owner.company.name[0];

    if ((alphabet.indexOf(value) == -1 && isNaN(parseInt(value))) ||
      (isNaN(alphabet[0]) && !isNaN(value))) {
      if(!isNaN(value))
        value = 123;

      alphabet.push(value);

      callcenterList.splice(i, 0, {
        divider: {
          alphabet: value
        }
      });
    }
  };

value = 123替换value = '#'会导致Google Chrome和Google Chrome Canary出现故障,并立即在Mac中使用高达100%的内存。

这是一个Javascript错误还是与Google Chrome本身有关?

2 个答案:

答案 0 :(得分:6)

这不是您的浏览器或其他任何内容中的错误:您只是创建了一个条件,您的代码进入无限循环,这往往会使浏览器陷入困境。您可以使用简单的while (true) {}循环执行相同的操作。

具体而言,您正在迭代callcenterList,并且随时isNaN(alphabet[0]),您正在将新元素拼接到callcenterListalphabet[0]将具有您推送的第一个值,在您查看的条件中,您将设置为'#'

因此,isNaN(alphabet[0])将永远为真。

因此,您将继续将值添加到callcenterList

因此i < callcenterList.length永远都是真的。

答案 1 :(得分:1)

由于很难相信长度被重新评估,这里有一个简单的例子,说明你可能会遇到什么问题

如果没有break语句,代码将在无限循环中运行。 (检查控制台日志中列表的长度)

&#13;
&#13;
var list = [0,1,2,3];

for (var i = 0; i < list.length; i++) {
  list.push(i);
  if (i > 1000) {
    break;
  }
}

console.log( list.length );
&#13;
&#13;
&#13;

您的代码完全相同,只是您的拼接功能会在列表的特定位置添加新元素(nl,您的索引)。最后,它仍然会增加长度,你的列表将会更长