使用?时的无限循环:“ for”循环中的条件

时间:2018-09-05 02:26:43

标签: javascript

这是两个比较差异的示例:

for (var i = 0; i < 1 < 2 ? 1 : 2; i++) {
    console.log(i);
}

它将记录:

  

1 2 3 ... 1000 2000 3000 ...

for (var i = 0; i < (1 < 2 ? 1 : 2); i++) {
    console.log(i);
}

它将记录:

  

0

我的问题:两者之间有什么区别

i < 1 < 2 ? 1 : 2

i < (1 < 2 ? 1 : 2)

P / S:如果您使用的是Chrome浏览器查看此问题,请按Shift + Esc打开Chrome任务管理器以强制停止运行此页面中的脚本(如果在单击< em>运行代码段)。

谢谢!

2 个答案:

答案 0 :(得分:1)

答案在JavaScript's operator precedence中。在该列表中,<运算符的优先级高于?:条件运算符,并且<具有从左到右的关联性,因此i < 1 < 2 ? 1 : 2被解释为{{1 }}。

立即可以看到,((i < 1) < 2) ? 1 : 2条件所解决的问题无关紧要;唯一可能的结果是<1,它们都是“真实的”。

为了完整性,2i < 1生成true,为i==0生成false,在数字上下文中使用时,其值为{{ 1}}或i>0,但是由于10都可靠地产生1 < 2,因此整个表达式始终求值为0 < 2

答案 1 :(得分:0)

您的第一个循环正在这样评估:

for (var i = 0; (i < 1) < 2 ? 1 : 2; i++) {
    console.log(i);
    if (i > 100) break;  // added to stop the infinite loop
}

(i < 1)时,表达式true将为1i=0。对于i >= 0的值,表达式(i < 1)为false,将隐式转换为0。对于i的所有值,不等式(i < 1) < 2的计算结果为true,因此值1将是三元表达式的输出。实际上,(i < 1) < 2是对还是假都不重要,因为结果是1和2,两者都是真实的。因此,您的循环基本上等效于以下内容:

for (var i = 0; true; i++) {
    console.log(i);
}

也就是说,它只是归结为i中的无限循环。

在上面的演示中,我在循环中添加了break语句,以防止其崩溃。