【问题标题】:Short-Circuiting to Print Every Value打印每个值的短路
【发布时间】:2020-04-20 16:38:57
【问题描述】:

这是我的代码:

for (let i = 0; i <= 100; i++) {
  let output = "";

  if (i % 3 === 0) {
    output += "Cool";
  }
  if (i % 5 === 0) {
    output += "Breeze";
  }
  console.log(output || i);
}

在此代码中,我使用 for 循环将绑定 i 的值从 0 更改为 100。

在第一个 if 语句中,我使用模数和加法赋值运算符将字符串“Cool”添加到绑定输出

在第二个 if 语句中,我使用模数和加法赋值运算符将字符串“Breeze”添加到绑定输出

我的 for 循环主体中的最后一条语句的功能是在浏览器控制台中打印输出绑定的值。我通过短路来做到这一点。现在,我了解了使用“OR”运算符进行短路的逻辑,因为解释器将短路其比较两个操作数的完整逻辑,如果可以将其转换为true,则自动选择左侧的操作数,即字符串和数字都可以,所以操作数 output 总是会被选择。

我不明白为什么需要短路才能在控制台中明显打印每个值。如果我要使用语句console.log(output);,它会合并数字类型值,说明在打印字符串之前连续打印了多少个。

有人能解释一下这个逻辑吗?为什么这里需要短路以防止合并?

【问题讨论】:

  • 简单地说,当你 OR 值时,你会得到他的第一个 truthy 值。所以,如果output被改变了,它就是真的,所以output || i会返回output,但是如果output = "",空字符串是falsy,所以output || i返回@ 987654331@
  • 这简单解释了短路的逻辑。我已经明白 0、NaN 和空字符串都算作假,如果它们是左操作数,就永远不会被选中。
  • 如果你只是console.log(output),那么i等于01246等等,你只是打印一个空字符串,你永远不会打印数字。

标签: javascript for-loop modulo short-circuiting


【解决方案1】:

如果我使用语句 console.log(output);它整合了数字类型值,说明在打印字符串之前连续打印了多少个。

如果其他人不清楚,您指的是:

这是浏览器控制台的产物,它将重复的日志合并在一起,使调试更容易。在这里,它合并了重复记录的空字符串。这不是您的代码逻辑的问题。如果您要通过任何其他方法记录输出,则空白输出将按您所期望的那样连续显示,而不是聚集在一起:

const table = document.querySelector('table').children[0];

for (let i = 0; i <= 100; i++) {
  let output = "";

  if (i % 3 === 0) {
    output += "Cool";
  }
  if (i % 5 === 0) {
    output += "Breeze";
  }
  table.innerHTML += `<tr>Cell value: ${output}</tr>`;
}
<table>
  <tbody>
  </tbody>
</table>

您的代码非常好,您只需要找到一种方法来显示它其他而不是console.log,这样它不直观的聚集就不会搞砸。

您也可以通过取消选中“Group Similar”来关闭分组:

【讨论】:

  • "这是浏览器控制台的产物," 它也是可配置的——你可以关闭分组行为。
  • 感谢您的意见,雪。你是对的,我指的是浏览器控制台中的分组工件。为什么短路会绕过它?是否有更深层次的逻辑,或者它几乎是“它的工作方式”。另外,我尝试使用模板文字,就像你建议的那样,我仍然得到了相同的结果。
  • @Custer @Custer || i 确保如果记录了空字符串,则改为记录当前索引,并且当前索引永远不会重复,因此没有分组。
  • @Custer 与短路无关。您只需打印 不同 行:012Cool4Breeze 等。因为没有两个是相同的,所以它们不是分组。
  • 如果您改为使用|| 'something',您会在'something's 上看到分组,因为它们偶尔会与刚刚记录的内容重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多