这是两个比较差异的示例:
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>运行代码段)。
谢谢!
答案 0 :(得分:1)
答案在JavaScript's operator precedence中。在该列表中,<
运算符的优先级高于?:
条件运算符,并且<
具有从左到右的关联性,因此i < 1 < 2 ? 1 : 2
被解释为{{1 }}。
立即可以看到,((i < 1) < 2) ? 1 : 2
条件所解决的问题无关紧要;唯一可能的结果是<
和1
,它们都是“真实的”。
为了完整性,2
为i < 1
生成true
,为i==0
生成false
,在数字上下文中使用时,其值为{{ 1}}或i>0
,但是由于1
和0
都可靠地产生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
将为1
或i=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
语句,以防止其崩溃。