代码之家  ›  专栏  ›  技术社区  ›  Tool

为什么在javascript中“0&&true”返回0而不是布尔值?

  •  3
  • Tool  · 技术社区  · 7 年前

    我确信Javascript中的任何逻辑表达式都会返回布尔值,但是这个表达式返回的是数字0而不是布尔值:

    0 && true
    > 0
    

    为什么会这样?在这种情况下,如何在Javascript中使用逻辑表达式来防止将来出现这种错误?

    背景故事-我对jQuery中的这句话感到困惑:

    $('.something').toggle(0 && true);
    

    它不会切换元素,因为返回的是“0”,而不是布尔值!

    也许有一些聪明的理由,但不能说我喜欢它。

    2 回复  |  直到 7 年前
        1
  •  17
  •   Maxime Chéramy    7 年前

    关于 && 接线员说:

    expr1 && expr2 :返回 expr1 如果可以转换为 false ;否则返回 expr2 .

    0

    资料来源: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Description

    你期望结果是什么 (布尔值),但是结果值的布尔值也是错误的。这意味着您可以在特定条件下使用它( if )并具有预期的行为。

    如果需要将其存储在变量中,并且希望使用布尔值,则可以将其转换。可以使用双重否定: !!

    !!(0 && true)

    或使用 Boolean :

    Boolean(0 && true)

        2
  •  3
  •   Daut Łukasz Blaszyński    7 年前

    正如@Maxime Chramy所指出的,JavaScript检查第一个元素是否返回false,而实际上不检查第二个元素。这节省了计算时间。

    JS不需要同时检查两个语句,如果第一个语句为false,它将不检查第二个语句,只返回第一个语句。如果第一个是真的,它不会检查第二个,它只是返回它。

    数字、对象、数组或字符串是真实的。

    使用Boolean()获取布尔值或使用short方法!!()

    'banana' && true  // returns true
    

    true && 'banana' // returns 'banana'
    Boolean(true && 'banana') // returns 'true'
    !!(true && 'banana') // returns 'true'
    

    true && 'banana' && 1 // returns 1
    true && 1 && 'banana' // returns 'banana'
    1 && 'banana' && true // returns true
    Boolean(true && 'banana' && 1) // returns 'true'
    !!(1 && 'banana' && true) // returns 'true'