为什么下述JavaScript代码会进入无限循环而不抛出错误?
你提供的代码如下:
const loopFn = function(num) { for(let a = 0; a < num || 10; a++) { console.log(a) } } let b = loopFn(8) console.log(b)
问题原因解析
1. 核心是运算符优先级差异
JavaScript中小于运算符<的优先级高于逻辑或运算符||,所以你写的a < num || 10会被JS引擎按照(a < num) || 10的顺序执行,而不是你预期的a < (num || 10)。
2. 逻辑或的返回值规则
逻辑或||的运算规则是:
- 先计算左侧表达式的布尔值,如果为
true,就返回左侧表达式的值 - 如果左侧表达式布尔值为
false,直接返回右侧表达式的值
在JS中所有非0数字的布尔值都是true,这里||右侧的10永远是真值。
3. 循环条件的执行过程
你传入的num为8,循环运行流程如下:
- 当
a从0到7时:a < 8结果为true,整个条件返回true,循环继续 - 当
a自增到8时:a < 8结果为false,||返回右侧的10,转布尔值为true,循环条件依然成立 - 后续
a无论增长到多大,a < 8永远为false,||永远返回10,永远为真值,循环永远不会终止,就出现了无限循环。
4. 为什么不会抛出错误
JS语法允许for循环的条件部分返回任意类型的值,执行时会自动隐式转为布尔值判断,你写的表达式完全符合JS语法规范,不存在语法错误,自然不会抛出错误。
内容的提问来源于stack exchange,提问作者user16983447
相关产品推荐
相关产品推荐

