为什么' y'在以下警报案例中显示两个不同的值?

时间:2018-03-01 17:58:09

标签: javascript operators logical-operators

考虑以下代码:

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'?

4 个答案:

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

总是执行布尔逻辑序列中所有条件的语言非常罕见;您应该期待 ANDOR以您学习的下一种语言采取这种方式。

在您的示例中,这意味着解释器发现y>1测试中的OR为真,因此它会立即跳过其余条件,包括后增量(++)。 第一个第二个AND条件已执行(因为第一个是true,而AND仅在false上停止。

请注意,如果您从y = 1开始,那么OR 增加y,但您的AND 将不会< / em>的

您应该订购OR个条件,以便最快找到true,并且应该命令AND条件最快找到false,“最快”意味着无论逻辑路径如何,您都可以通过最少的处理获得答案。