我曾经认为Javascript中的任何逻辑表达式都会返回布尔值,但是这个表达式返回了数字0而不是布尔值:
0 && true
> 0
为什么会这样?在这种情况下,我如何处理JavaScript中的逻辑表达式以避免将来出现这种错误?
背景故事 - 我对jQuery中的这个语句感到困惑:
$('.something').toggle(0 && true);
它不能切换元素,因为返回的是数字“0”,而不是布尔值!
也许有一些聪明的原因解释这样做的必要性,但我不太喜欢。
我曾经认为Javascript中的任何逻辑表达式都会返回布尔值,但是这个表达式返回了数字0而不是布尔值:
0 && true
> 0
为什么会这样?在这种情况下,我如何处理JavaScript中的逻辑表达式以避免将来出现这种错误?
背景故事 - 我对jQuery中的这个语句感到困惑:
$('.something').toggle(0 && true);
它不能切换元素,因为返回的是数字“0”,而不是布尔值!
也许有一些聪明的原因解释这样做的必要性,但我不太喜欢。
&&
运算符的文档说明:
这就是为什么它返回第一个值:
expr1 && expr2
: 如果expr1
可以转换为false
,则返回expr1
;否则,返回expr2
。
0
来源: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators#Description
你期望得到false
(布尔值),但是结果的布尔值也是假值。这意味着您可以在条件语句(if
)中使用它并获得预期的行为。!!
!!(0 && true)
或者使用Boolean
:
Boolean(0 && true)
正如Maxime Chéramy所指出的,JavaScript检查第一个元素是否为false,而且它并没有真正检查第二个元素。这样可以节省计算时间。
如果第一个语句为false,JS就不需要检查两个语句,它只会返回第一个语句。如果第一个语句为true,它也不会检查第二个语句,它只是返回它。
数字、对象、数组或字符串都是真实值。
使用Boolean()获取布尔值或使用短方法!!()
'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'
0 && true
的计算结果为0
,因为0
是表达式中第一个 falsy 部分,所以在if
语句中它可以正常工作。 - t.niese!!(0&&true)
或Boolean(0&&true)
方法。 - t.niese.toggle
,因为它接受各种值。如果你传递一个布尔值,那么你要么显示要么隐藏元素。传递一个数字会设置延迟时间。传递一个字符串则会被视为数字。传递一个对象则会被视为设置。传递undefined
相当于只调用.toggle()
而没有参数。完成后会执行一个函数。如果你传入null
,我不知道会发生什么 - 可能会被视为false
...或者一个对象。这很复杂。 - VLAZ