为什么无限循环不会抛出错误

3

这是我的代码片段

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),但我很好奇为什么它会导致无限循环而不是报错。

2
因为10总是true,所以这是合法的语法。 - Wimanicesir
2
因为 a < num || 10 的意思是:如果(a < 10)或者(10)。而且由于10为真值,所以该条件总是为真。 - Jeremy Thille
6个回答

1
你的意思是要做什么。
const count = num || 10;

for(let a = 0; a < count; a++) { 
    console.log(a)
}

但实际上你正在表达的是,当a小于8或者10true


1
语言/执行引擎并不会将其报告为错误,因为无限循环本身并没有固有的问题。
根据使用情况,无限循环是有帮助的。例如,在旨在处理队列中作业的守护进程脚本中。

0

你的 for 循环条件是:

a < num || 10

如果 a < num 为真,或者 10 为真,则循环继续。

在您的浏览器控制台中尝试,您会发现,10 总是为真。 if(10) alert("true")

如果您希望循环在 a 不小于 10 时结束,请尝试以下操作:

for(let a = 0; a < num || a < 10; a++) 

这违背了设置第二个检查的初衷。你应该使用 OR 运算符而不是 AND 运算符。 - Wimanicesir
a < num || a < 10 不等于 a < (num || 10)。考虑 num = 8 - Raeisi

0
for循环的第二部分是条件; 条件的布尔结果告诉for循环停止或继续; 当你输入10时,它将被评估为true; 因此,for循环永远不会结束; 就好像你写的是。
if (10) {
  // do something
}

0

如果您没有将逻辑包含在括号中,那么它将像这样分割

它要么检查a<num为真,要么检查10为真表达式。

它将10作为真表达式,因为它是一个非零数字。所以每次循环都会得到第二个表达式为真等等。

如果您将条件包装起来,则会像这样检查

要么a<num,要么a<10

当匹配任何一个表达式为假时,它将停止。

这只是使用括号的用法。


0
原因在于JavaScript(或任何语言)中的运算符优先级。当您将表达式 a<num||10 传递给您的for循环的break条件时,它首先评估a<num部分,然后是||10部分。a<num将为您提供一个true/false值,而10将为您提供10(一个真实值),因此a<num||10实际上会检查a<num10中是否有一个真实值,这是正确的。因此,出现了无限循环。
更多关于运算符优先级的信息: MDN文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接