列表操作导致无限循环

List manipulation leads to infinite loop

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

  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 发生故障并立即使用最多 100% Mac.

中的 RAM

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

这不是您的浏览器中的错误或其他任何错误:您只是在创建一个条件,使您的代码进入无限循环,这总是会使浏览器卡住。你可以用一个简单的 while (true) {} 循环做同样的事情。

具体来说,您正在遍历 callcenterList,并且任何时候 isNaN(alphabet[0]),您都在将一个新元素拼接到 callcenterListalphabet[0] 将拥有您推送到那里的第一个值,在您正在查看的条件下,您将设置为 '#'

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

因此,您将继续向 callcenterList 添加值。

因此 i < callcenterList.length 将永远为真。

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

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

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

除了您的拼接函数将在列表的特定位置(nl,您的索引)添加新元素外,您的代码完全相同。最后还是会增加长度,你的列表会长一个