这是我的代码片段
const loopFn = function(num) {
for(let a = 0; a < num || 10; a++) {
console.log(a)
}
}
let b = loopFn(8)
console.log(b)
我知道正确的写法是a < (num || 10)
,我只是好奇为什么它会导致无限循环而不是报告错误。
你的意思是…
const count = num || 10;
for(let a = 0; a < count; a++) {
console.log(a)
}
但是你实际上是在说当a
小于8
或者10
等于true
语言/执行引擎不会将其报告为错误,因为无限循环本身没有固有的问题。
根据用例,无限循环是有帮助的。例如,在用于处理队列中的作业的守护进程脚本中。
for循环的第二部分是condition;布尔值的结果告诉for循环是停止还是继续;当你输入10
时,它将被计算为true;因此for循环永远不会结束;就好像你在写
if (10) {
// do something
}
如果您没有将逻辑包装在括号内,那么它将像这样分割
检查a<num
是否为真,或者10
是否为真。
它取10为真表达式,因为它是一个非零数。所以每次循环得到第二个表达式为真,以此类推
如果你把条件括起来,它会像这样检查
a<num
或a<10
当它匹配任何一个表达式false时,它将停止。
它只是使用括号。
原因是JavaScript(或任何语言)中的运算符优先级。当您将表达式a<num||10
传递给for循环的中断条件时,它首先计算a<num
部分,然后计算||10
部分。a<num
将为您提供一个真/假值,10
将为您提供10(真值),因此a<num||10
基本上会检查a<num
或10
中的一个是否为真值,这是真的。因此,无限循环。
更多关于操作符优先级的信息:MDN文档
for循环的条件是:
a < num || 10
如果有<Num为真,或者10为真,循环继续。>
在浏览器控制台中尝试一下,您将看到,10总是为真。如果(10)警报("true"
如果你想在a不是<10、试试这个:
for(let a = 0; a < num || a < 10; a++)