【问题标题】:In JavaScript, why does (undefined && true) return undefined? [duplicate]在 JavaScript 中,为什么 (undefined && true) 返回 undefined? [复制]
【发布时间】:2014-05-11 03:32:58
【问题描述】:

使用 node.js 控制台(节点 0.10.24)

> var x = (undefined && true);
undefined
> x;
undefined
> x = (true && undefined);
undefined
> x;
undefined

为什么比较返回未定义?我希望它返回 false,因为 undefined 被认为是“错误的”。

【问题讨论】:

标签: javascript node.js


【解决方案1】:

&& 运算符通过内部将表达式的值强制为布尔值进行,但运算符的结果始终是第一个实际的、未强制的值失败的表达式(即,这是错误的)。

因此(true && undefined) 将导致undefined,因为true 虚假的。同样,(true && 0) 的计算结果为 0

【讨论】:

  • 结果是失败的 first 表达式的非强制值(因为一旦失败就停止执行)。
  • @AaronDufour 哦,对;杜尔。谢谢!
【解决方案2】:

在 javascript 中,||&& 不保证返回布尔值,只有当操作数是布尔值时才会这样做。

a = b || c 本质上是一个快捷方式:

a = b ? b : c;

a = b && c本质上是一个快捷方式:

a = b ? c : b;
//or
a = !b ? b : c;

【讨论】:

    【解决方案3】:

    为了正式化其他人的说法,以下是 ECMAScript specification 关于如何评估逻辑 AND 运算符的内容:

    1. 令 lref 为评估 LogicalANDExpression 的结果。
    2. 设 lval 为 GetValue(lref)。
    3. 如果 ToBoolean(lval) 为 false,则返回 lval。
    4. 设 rref 为计算 BitwiseORExpression 的结果。
    5. 返回 GetValue(rref)。

    也许最相关的是第 11.11 节底部的注释:

    && 或 || 产生的值运算符不一定是类型 布尔值。产生的价值将永远是两者之一的价值 操作数表达式。

    【讨论】:

    • 谢谢。我在浪费时间查看“未定义”的文档,而不是 AND 运算符
    【解决方案4】:

    其他答案绰绰有余,我将我的答案包括在这里以防万一其他人的大脑像我一样工作:

    考虑到短路,布尔 || 和布尔 && 运算符的结果将始终是最后一个表达式的结果。

    因此,对于||,如果第一个表达式是truthy,短路评估意味着忽略其余部分,结果将是第一个表达式的值。如果是falsy,则计算必须继续到第二个表达式,无论是真还是假,结果都将是第二个表达式的结果。

    && 类似,如果第一个表达式是falsy,则计算停止,结果是第一个表达式的结果,如果是truthy,则继续计算,结果是第二个表达式的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      相关资源
      最近更新 更多