为什么 '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
)。
总是执行布尔逻辑序列中所有条件的语言非常罕见;你应该期望AND
和OR
在你学习的下一门语言中这样做。
在您的示例中,这意味着解释器发现 OR
测试中的 y>1
为真,因此它立即跳过其余条件,包括后增量(++
).
第一个和第二个AND
条件被执行(因为第一个是true
,而AND
只在false
上停止)。
请注意,如果您从 y = 1
开始,那么 OR
将 递增 y
,但您的 AND
不会.
您应该对 OR
条件进行排序,以便最快找到 true
,并且对您的 AND
条件进行排序,以便最快找到 false
,其中 "soonest" 表示任何逻辑路径都能让您以最少的处理得到答案。
考虑以下代码:
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
)。
总是执行布尔逻辑序列中所有条件的语言非常罕见;你应该期望AND
和OR
在你学习的下一门语言中这样做。
在您的示例中,这意味着解释器发现 OR
测试中的 y>1
为真,因此它立即跳过其余条件,包括后增量(++
).
第一个和第二个AND
条件被执行(因为第一个是true
,而AND
只在false
上停止)。
请注意,如果您从 y = 1
开始,那么 OR
将 递增 y
,但您的 AND
不会.
您应该对 OR
条件进行排序,以便最快找到 true
,并且对您的 AND
条件进行排序,以便最快找到 false
,其中 "soonest" 表示任何逻辑路径都能让您以最少的处理得到答案。