我已经将x和y声明为这样的数字:
var x = 5;
var y = 0;
然后我想使用for循环。 如果我有这样的代码,它就可以正常工作:
for(let i = y; i < ((x == 5) ? x : x); i++) {
console.log(i, x);
};
但是,如果我将短括号周围的圆括号去掉,那么for将会无休止地进行下去。为什么?下面的示例:
for(let i = y; i < (x == 5) ? x : x; i++) {
console.log(i, x);
};
答案 0 :(得分:1)
在每次循环中检查for循环中间部分的条件是否真实。
省略括号,i < (x == 5) ? x : x
被评估为
如果i
小于(x == 5)
,则返回x
,否则返回x
因此,将一个整数与一个布尔值进行比较,该布尔值起初没有多大意义,但除此之外,该条件始终求值为x
,这是事实(除非您给出了此值)值0)。因此循环将永远持续下去。
答案 1 :(得分:1)
您需要先分解代码
i < ((x == 5) ? x : x)
此表达式由编译器评估为
((x == 5) ? x : x)
对此进行比较,并将结果与i进行比较。
而
i < (x == 5) ? x : x
这被比较为
i < (x == 5)
,然后比较结果并获得x的值。 因此,当您每次获得x的值而不管i的值如何时,条件都会变为真,而您将得到无限循环
答案 2 :(得分:0)
根据order of precedence,列表上的比较(<
)高于条件运算符(... ? ... : ...)
。
所以i < (x == 5) ? x : x
的求值顺序实际上是(i < (x == 5)) ? x : x
或
x == 5
。i < resultFromFirstStep
。x
,请返回true
。x
。第3步和第4步在这里恰好相同。因此,由于结果总是是真实的(x
是5
),因此循环将永远持续下去。
答案 3 :(得分:0)
conditional (ternary) operator的操作方式如下:
条件? exprIfTrue:exprIfFalse
...在第一个示例中,condition
部分为:(x == 5)
,其结果为x
(5),使您的for
循环条件计算为:
for(let i = y; i < 5; i++) {
因此,您的循环将循环5
个迭代。
但是,在第二个示例中,您的condition
部分是:i < (x == 5)
,其结果为i < true
,其中true
被视为1
,依此类推i < 1
为true
,因此您的for
循环条件为:
for(let i = y; 5; i++) {
由于您总是返回5
(这是一个真实值),无论您的三元变量是什么,for循环都会永远循环。