Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 做&&&;and | |运算符将其操作数转换为布尔值?_Javascript - Fatal编程技术网

Javascript 做&&&;and | |运算符将其操作数转换为布尔值?

Javascript 做&&&;and | |运算符将其操作数转换为布尔值?,javascript,Javascript,弗拉纳根的O'Reilly JavaScript书指出: 与&&和| |运算符不同,它的!运算符将其操作数转换为 反转转换值之前的布尔值[…] 如果这些逻辑运算符不将操作数转换为布尔值,如何计算表达式?在计算表达式时,操作数被解释为布尔值,但&&或| |的返回值始终是其中一个操作数 例如: true && 0 === 0, not false 1 || false === 1, not true 它们确实将值转换为布尔值,但仅用于确定如何继续计算表达式。表达式的结果不一定是布尔

弗拉纳根的O'Reilly JavaScript书指出:

与&&和| |运算符不同,它的!运算符将其操作数转换为 反转转换值之前的布尔值[…]


如果这些逻辑运算符不将操作数转换为布尔值,如何计算表达式?

在计算表达式时,操作数被解释为布尔值,但&&或| |的返回值始终是其中一个操作数

例如:

true && 0 === 0, not false
1 || false === 1, not true
它们确实将值转换为布尔值,但仅用于确定如何继续计算表达式。表达式的结果不一定是布尔值(事实上,如果两个操作数都不是布尔值,则它将不是给您一个布尔值):


因为JavaScript的思想涵盖的不仅仅是布尔运算。

Per,第11.11节:二进制逻辑运算符:

[evaluation
&&
]的产生。。。评估结果如下:

  • 设lref为逻辑表达式求值的结果
  • 设lval为GetValue(lref)
  • 如果
    ToBoolean(lval)
    为false,则返回lval
  • 让rref作为计算BitwiseORExpression的结果
  • 返回GetValue(rref) [evaluation
    |
    ]的产生。。。评估结果如下:

  • 设lref为逻辑表达式求值的结果
  • 设lval为GetValue(lref)
  • 如果
    ToBoolean(lval)
    为true,则返回lval
  • 设rref为逻辑表达式求值的结果
  • 返回GetValue(rref)
  • 因此,在内部,该值被“转换为布尔值”。然而,由于这一点从未被公开过——而整个语义解释是一个可以“优化”的抽象——
    &&
    |
    的行为可以通过使用truthy和falsy值来简单地解释(对于
    ToBoolean
    所涵盖的:truthy值是
    ToBoolean
    返回true的值,所有其他值都为false)

    &&
    的逻辑表是:

    a b result truthy any b falsy any a a b result truthy any a falsy any b 请注意,会返回
    a
    b
    的求值结果

    快乐编码


    为完整起见,第9.2节:

    抽象操作
    ToBoolean
    将其参数转换为布尔类型的值,如

    • 未定义-错误
    • 空-假
    • 布尔(不是布尔对象!)-结果等于输入参数(无转换)
    • 数字(不是数字对象!)-如果参数为+0、-0或NaN,则结果为false;否则结果为true
    • string(不是string对象!)-如果参数是空字符串(其长度为零),则结果为false;否则结果为true
    • 对象-真实

    既然我们有不同的答案,有没有人有文档可以告诉我们呢?它确实调用了
    ToBoolean
    (根据ECMAScript ed.5第11.11节)…没有投票了,但这是正确的。没错。如果你把
    true&&0
    放进JS控制台,输出将是
    0
    ,但是如果你把
    If(true&&0){true;}否则{false;}
    ,输出将是
    false
    。哈哈,是的,这是真的。我现在(非正式地)教给一群13岁的孩子,我想知道他们将来看到其他无聊的语言时会怎么想:-)感谢您详细介绍返回值谢谢!说JavaScript表达式是假的和说它是假的之间有区别吗?@ppecher:“false”表示“行为类似”的值当需要布尔值时,
    false
    。换句话说,
    ToBoolean
    的任何内容都会转换为
    false
    。因此,
    0
    null
    等都是“false”。“false”表示实际的布尔值,
    false
    @ppecher:当你说“false”时,大多数人会认为它是一个布尔值(值为false)。当你说“falsy”时,大多数人会理解它是一个值,如果转换为布尔值,它将为false,但不一定是布尔值本身。另请参阅 a b result truthy any a falsy any b