【发布时间】: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 > unixEndTime) { break; }会更具可读性。 -
在逻辑上,AND 和 OR 是可交换的(可以在不改变含义的情况下重新排序),但在计算中,当表达式的逻辑结果在完成计算之前就可以知道时,编译器会采取捷径跳过执行.如果 A 为假,那么大多数编程语言将跳过对 A && B && C && D 其余部分的求值。这意味着,如果 D 有副作用(例如,因为我们超过了循环的结尾而出现异常),则如果 A 为假,则不会感觉到副作用。 (如果 A 在 A || B || C 中为真,则相同 ...)
-
i < listLength在第二种情况下充当守卫,而前一种使用“过去数组长度”迭代器进行评估,导致异常。
标签: javascript loops logical-operators