为什么 'y' 在以下警报情况下显示两个不同的值?

Why 'y' shows two different values in the below alert cases?

考虑以下代码:

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

的两个不同值

在第一个示例中,您正在缩短执行时间:

y>1  // This is already true
||
(y++ ===4) // So this is not executed

在 OR 条件语句中,如果第一个条件通过,则不检查后续条件,即 y 的值递增。

AND 条件相反。如果第一个条件为假,则不会检查后续条件。

你没有问过,但可能也值得注意 y++ === 4 将在 与 4 进行比较后增加 y 的值。因此,当执行下一条语句时,y 的值已增加到 5,即使它与 4 进行比较它是 4。如果您想要将 y 的增量值与 4 进行比较,那么首先完成增量 ++y === 4。这将递增,然后然后进行比较。

由于逻辑表达式是从左到右计算的,因此使用以下规则测试它们是否可能进行“short-circuit”计算:

false && (anything) is short-circuit evaluated to false.

true || (anything) is short-circuit evaluated to true.

即在 || (or) 运算符的情况下,如果第一个计算结果为真,则不检查第二个条件,而在 &&(and) 运算符的情况下,如果第一个计算结果为假,则不检查第二个条件。

真正的答案是"because skipping redundant processing makes programs run faster"。

Compiler/interpreter 设计人员总是在寻找像这样的小优化,这将使使用他们的语言的程序 运行 更快。

逻辑 OR (||) 计算直到它遇到第一个 true 条件或直到它发现所有条件都是 false。一旦 OR 遇到第一个 true 条件,没有其他条件可以改变 OR 最终将计算为 true 的事实,那么为什么还要执行它们呢?

出于同样的原因,逻辑 AND (&&) 计算直到它遇到第一个 false 条件(或发现所有条件都是 true)。

总是执行布尔逻辑序列中所有条件的语言非常罕见;你应该期望ANDOR在你学习的下一门语言中这样做。

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

请注意,如果您从 y = 1 开始,那么 OR 递增 y,但您的 AND 不会.

您应该对 OR 条件进行排序,以便最快找到 true,并且对您的 AND 条件进行排序,以便最快找到 false,其中 "soonest" 表示任何逻辑路径都能让您以最少的处理得到答案。