【问题标题】: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)。

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

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

        请注意,如果您以y = 1 开头,则OR 增加y,但您的AND 不会

        您应该订购您的OR 条件,以便它最快找到true,并且您的AND 条件应该订购您的false 最快,其中“最快”表示任何逻辑路径可以让您找到答案处理最少。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多