【问题标题】:javascript for loop behaving weirdly when updating and logging an array inside the loopjavascript for 循环在循环内更新和记录数组时表现奇怪
【发布时间】:2018-08-13 10:14:36
【问题描述】:

我有以下 JavaScript 代码

let logs = [];
for (let j = 0; j < 10; j++) {
  logs[j] = { j };
  console.log('logs', logs);
}

我希望输出如下

logs [ { j: 0 } ]
logs [ { j: 0 }, { j: 1 } ]
logs [ { j: 0 }, { j: 1 }, { j: 2 } ]
logs [ { j: 0 }, { j: 1 }, { j: 2 }, { j: 3 } ]
logs [ { j: 0 }, { j: 1 }, { j: 2 }, { j: 3 }, { j: 4 } ]
logs [ { j: 0 }, { j: 1 }, { j: 2 }, { j: 3 }, { j: 4 }, { j: 5 } ]...

这就是我在 nodejs 控制台中运行此代码时得到的结果。

但是当我在浏览器中签入时,我得到以下输出

logs [ { j: 0 },
  { j: 1 },
  { j: 2 },
  { j: 3 },
  { j: 4 },
  { j: 5 },
  { j: 6 },
  { j: 7 },
  { j: 8 },
  { j: 9 } ]

每次迭代

【问题讨论】:

  • 您必须添加 2 个循环,1 个用于垂直,另一个用于水平。
  • 您将此标记为节点,您运行的是什么版本?这真的是所有内容都已注销,还是您的控制台只是滚动离开?
  • @vikscool 循环工作,将它放在节点控制台或浏览器中
  • 您需要为此编写一个嵌套循环。第一个循环需要处理行号,第二个循环需要处理列号。
  • @Luca 我正在使用节点 8.9.4。不,这还不是全部注销。我可能应该提到这一点

标签: javascript node.js for-loop


【解决方案1】:

您无法控制浏览器如何显示console.log 输出。显示您提到的值的一种方法是将对象字符串化为 JSON(阅读what is JSON),然后在控制台上显示。

let logs = [];
for (let j = 0; j < 10; j++) {
  logs[j] = { j };
  console.log('logs', JSON.stringify(logs));
}

【讨论】:

    【解决方案2】:

    代码实际上正在按照您的预期进行。在下面的 sn-p 中查看结果:

    let logs = [];
    for (let j = 0; j < 10; j++) {
      logs[j] = {
        j
      }
      console.log('logs', logs)
    }

    请注意,stack-sn-p 中显示的结果与浏览器中显示的结果不同。这是因为 stack-sn-p 的控制台会立即评估变量 logs,而(大多数)浏览器会在您查看它们时评估该值。因此,当您查看它们时,该变量在数组中有 10 个元素。

    验证这一点的一个简单更改是在登录到控制台之前对数组进行字符串化。下面的 sn-p 应该会产生预期的结果:

    let logs = [];
    for (let j = 0; j < 10; j++) {
      logs[j] = {
        j
      }
      console.log('logs', JSON.stringify(logs));
    }

    相关:Is Chrome's JavaScript console lazy about evaluating arrays?

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2014-03-15
      • 1970-01-01
      • 2021-10-28
      • 2019-08-05
      相关资源
      最近更新 更多