【问题标题】:Why 'y' shows two different values in the below alert cases?为什么 'y' 在以下警报案例中显示两个不同的值?
【发布时间】:2018-03-01 17:58:08
【问题描述】:
考虑下面的代码:
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' 值?
【问题讨论】:
标签:
javascript
operators
logical-operators
【解决方案1】:
在第一个示例中,您正在缩短执行:
y>1 // This is already true
||
(y++ ===4) // So this is not executed
【解决方案2】:
在 OR 条件语句中,如果第一个条件通过,则不检查后续条件,这就是 y 的值递增的地方。
AND 条件相反。如果第一个条件为假,则不检查后续条件。
你没有问过这件事,但也可能值得注意的是
y++ === 4
与 4 比较后 y 的值将递增。因此,当执行下一条语句时,y 的值已递增至 5,即使与 4 比较时为 4 . 如果您想将 y 的递增值与 4 进行比较,则首先递增完成 ++y === 4。这将增加并然后进行比较。
【解决方案3】:
由于逻辑表达式是从左到右评估的,因此使用以下规则测试它们是否存在可能的“短路”评估:
false && (anything) 短路评估为 false。
真|| (anything) 短路评估为真。
即在 || (or) 运算符的情况下,如果第一个计算结果为 true,则不检查第二个条件,而在 &&(and) 运算符的情况下,如果第一个计算结果为 false,则不检查第二个条件。
【解决方案4】:
这里真正的答案是“因为跳过冗余处理使程序运行得更快”。
编译器/解释器设计者总是在寻找这样的小优化,以使他们的语言中的程序运行得更快。
逻辑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 最快,其中“最快”表示任何逻辑路径可以让您找到答案处理最少。