【问题标题】:JS why FOR LOOP not iterating when condition is A&&B but works when B&&A (A==B==true) [closed]JS 为什么 FOR LOOP 在条件为 A&&B 时不迭代但在 B&&A 时工作(A==B==true)[关闭]
【发布时间】:2020-09-20 01:56:29
【问题描述】:

这是我的第一个问题,大家好!

我想以尽快终止循环的方式编写条件。

不工作但应该更快终止循环的循环:

for (
      let i = 0;
      transactionsSortedByTime[i].unixTime <= unixEndTime && i < listLength;
      i++
    ) {}

有效的循环:

for (
      let i = 0;
       i < listLength && transactionsSortedByTime[i].unixTime <= unixEndTime;
      i++
    ) {}

到目前为止,我确信 A&&B 和 B&&A 的结果是相同的,但在不同的时间以错误的结果终止(当其中一个 {A 或 B} 为假时)。

我的问题是为什么第二个循环可以正确迭代,而第一个循环却没有。

【问题讨论】:

  • i 小于listLength时,您超出了数组的末尾,因此访问元素将获得undefined
  • 您是否尝试将条件包装在 ( ) 中?
  • 恕我直言,循环主体中的if (transactionsSortedByTime[i].unixTime &gt; unixEndTime) { break; } 会更具可读性。
  • 在逻辑上,AND 和 OR 是可交换的(可以在不改变含义的情况下重新排序),但在计算中,当表达式的逻辑结果在完成计算之前就可以知道时,编译器会采取捷径跳过执行.如果 A 为假,那么大多数编程语言将跳过对 A && B && C && D 其余部分的求值。这意味着,如果 D 有副作用(例如,因为我们超过了循环的结尾而出现异常),则如果 A 为假,则不会感觉到副作用。 (如果 A 在 A || B || C 中为真,则相同 ...)
  • i &lt; listLength 在第二种情况下充当守卫,而前一种使用“过去数组长度”迭代器进行评估,导致异常。

标签: javascript loops logical-operators


【解决方案1】:

在您的情况下,A &amp; BB &amp; A 不同,因为在第一个代码 sn-p 中,您在检查 i 是否小于 listLength 之前访问了 transactionsSortedByTime 数组的 i'th 索引.当i &lt; listLength 为假时,这样做会给你不确定的。

所以i &lt; listLength 应该写在transactionsSortedByTime[i].unixTime &lt;= unixEndTime 之前,以确保您的代码不会尝试访问超出transactionsSortedByTime 数组范围的索引。

【讨论】:

    【解决方案2】:

    只需添加 (),循环结构显然采用第一个表达式的 bool 值,要解决这个问题,您必须添加括号,以便您的表达式采用 && 运算符的值:

    for (
      let i = 0;
      (transactionsSortedByTime[i].unixTime <= unixEndTime && i < listLength);
      i++
    ) {}
    

    【讨论】:

    • "取第一个表达式的布尔值"。这包括&amp;&amp; 运算符
    猜你喜欢
    • 2019-10-27
    • 2014-03-29
    • 2021-10-06
    • 1970-01-01
    • 2011-05-30
    • 2010-12-08
    • 1970-01-01
    • 2011-08-10
    • 2023-01-14
    相关资源
    最近更新 更多