考虑以下代码:
var y = 4;
alert( y>1 || (y++ ===4))
alert(y);
在这里,' y'警报4。 但是在下面的代码中:
var y = 4;
alert( y>1 && (y++ ===4))
alert(y);
在这里,' y'警报5。 为什么&&和||运营商正在显示两个不同的值' y'?
答案 0 :(得分:2)
在第一个示例中,您正在快捷执行:
y>1 // This is already true
||
(y++ ===4) // So this is not executed
答案 1 :(得分:2)
在OR条件语句中,如果第一个条件通过,则不检查后续条件,即y的值递增的位置。
AND条件反向运行。如果第一个条件为假,则不会检查后续条件。
你没有问过这个问题,但也可能值得注意
y++ === 4
将的值增加到之后将其与4进行比较。因此,当执行下一个语句时,y的值已增加到5,即使它与4进行比较时它也是4如果您想将y的递增值与4进行比较,则首先递增++y === 4
。这将增加,然后进行比较。
答案 2 :(得分:1)
当逻辑表达式从左到右进行评估时,它们会被测试可能的短路"评估使用以下规则:
false&& (任何)短路评估为假。
true || (任何)短路评估为真。
在|| (or)
运算符的情况下,如果第一个计算结果为true,则不检查第二个条件,如果是&&(and)
运算符,则不检查第二个条件,如果第一个计算结果为false。
答案 3 :(得分:1)
这里真正的答案是“因为跳过冗余处理会使程序运行得更快”。
编译器/解释器设计人员总是在寻找像这样的小优化,这将使他们语言的程序运行得更快。
逻辑OR
(||
)进行评估,直到达到第一个true
条件或直到它发现所有条件都为false
为止。在OR
遇到第一个true
条件后,没有其他条件可以改变OR
最终将评估为true
的事实,那么为什么还要执行它们呢?
出于同样的原因,逻辑AND
(&&
)会进行评估,直到达到第一个false
条件(或发现所有条件都为true
)。
总是执行布尔逻辑序列中所有条件的语言非常罕见;您应该期待 AND
和OR
以您学习的下一种语言采取这种方式。
在您的示例中,这意味着解释器发现y>1
测试中的OR
为真,因此它会立即跳过其余条件,包括后增量(++
)。
第一个和第二个AND
条件已执行(因为第一个是true
,而AND
仅在false
上停止。
请注意,如果您从y = 1
开始,那么OR
将增加y
,但您的AND
将不会< / em>的
您应该订购OR
个条件,以便最快找到true
,并且应该命令AND
条件最快找到false
,“最快”意味着无论逻辑路径如何,您都可以通过最少的处理获得答案。