Flanagan的O'Reilly JavaScript书指出:



如果这些逻辑运算符未将操作数转换为 bool(boolean) 值,则该表达式如何求值?

最佳答案

根据specification第11.11节:二进制逻辑运算符:

[评估&&]的产生如下评估:

  • 令lref为评估LogicalANDExpression的结果。
  • 令lval为GetValue(lref)。
  • 如果ToBoolean(lval)为false,则返回lval。
  • 令rref为评估BitwiseORExpression的结果。
  • 返回GetValue(rref)。

  • [评估||]的产生如下评估:
  • 令lref为评估LogicalORExpression的结果。
  • 令lval为GetValue(lref)。
  • 如果ToBoolean(lval)为true,则返回lval。
  • 令rref为评估LogicalANDExpression的结果。
  • 返回GetValue(rref)。

  • 因此,在内部将值“转换为 bool(boolean) 值”。但是,由于从不公开-整个语义解释都是可以“/被优化”的抽象,因此&&||的行为可以通过使用真假值(ToBoolean)来简单解释。涵盖:真值是ToBoolean返回true的值,其他所有值都是falsy)。
    &&的逻辑表是:

    a b结果
    诚实的任何b
    虚假的任何一个
    ||的逻辑表是:

    a b结果
    说实话
    虚假的任何b

    请注意,返回的是ab的评估。

    快乐的编码。

    为了完整起见,请参见第9.2节:

    抽象操作ToBoolean将其参数转换为boolean类型的值,作为...
  • 未定义-假
  • Null-假
  • bool(boolean) 值(不是 bool(boolean) 对象!)-结果等于输入参数(不转换)。
  • number(不是Number对象!)-如果参数为+ 0,-0或NaN,则结果为false;否则为false。否则结果为true。
  • 字符串(不是String对象!)-如果参数为空String(其长度为零),则结果为false;否则为false。否则结果为true。
  • 对象-真
  • 10-04 22:05