【问题标题】:List manipulation leads to infinite loop列表操作导致无限循环
【发布时间】:2016-05-31 06:56:20
【问题描述】:

我正在尝试在 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 出现故障并立即使用 Mac 中高达 100% 的 RAM。

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

【问题讨论】:

  • 以前从未听说过那个...
  • 如果你使用双引号而不是单引号会有什么不同吗?
  • 好吧,如果它是#,那么它就不是字母表的一部分,也不是数字,而且由于您根据 callcenterList.length 限制循环(并推入循环)我不认为它与 # 和 chrome 无关? :)
  • @Icepickle isNaN('#') 返回真。该问题与将值更改为 123 或 # 以及它是否为数字无关。如果我将值更改为 ='AA',则不会出现问题。
  • @Yagiz,这只是您将元素推入您正在迭代的列表中的一种奇特方式,这可能会导致严重问题,就像您在此处看到的那样

标签: javascript arrays infinite-loop


【解决方案1】:

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

如果没有 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,您的索引)添加新元素。最后还是会增加长度,你的列表会长一个

【讨论】:

    【解决方案2】:

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

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

    因此,isNaN(alphabet[0]) 将始终为真。

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

    因此i &lt; callcenterList.length 将永远为真。

    【讨论】:

    • 这是一个简单的 for 循环。并且没有任何条件可以创建无限循环。即使“if”条件看起来是错误的,for 循环也应该继续迭代。在这种情况下我做错了什么?
    • @Yagiz 您正在使用splice 向循环内的迭代数组添加一个元素。由于每次都这样做,i 永远不会达到数组的长度。
    • @Yagiz:我在回答中添加了更详细的解释。基本上,E_net4 所说的:每次迭代都会增加数组的长度,所以你永远不会到达它的尽头。
    • 这似乎是合理的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2021-05-07
    • 2012-08-24
    • 2020-11-16
    相关资源
    最近更新 更多