速记是否需要放在方括号中?

时间:2019-10-02 13:34:26

标签: javascript

我已经将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);
};

4 个答案:

答案 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

  1. 评估x == 5
  2. 评估i < resultFromFirstStep
  3. 如果比较为x,请返回true
  4. 否则返回x

第3步和第4步在这里恰好相同。因此,由于结果总是是真实的(x5),因此循环将永远持续下去。

答案 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 < 1true,因此您的for循环条件为:

for(let i = y; 5; i++) {

由于您总是返回5(这是一个真实值),无论您的三元变量是什么,for循环都会永远循环。