我确信Javascript中的任何逻辑表达式都将返回布尔值,但是该表达式返回数字0而不是布尔值:
0 && true
> 0
为什么会这样?在这种情况下,如何在Javascript中处理逻辑表达式以防止将来出现这种错误?
背景故事-我对jQuery中的这一说法感到困惑:
$('.something').toggle(0 && true);
它不会切换元素,因为返回的是“ 0”,而不是布尔值!
也许是有一些聪明的原因,但是不能说我喜欢它。
答案 0 :(得分:8)
有关&&
运算符的文档说:
expr1 && expr2
:如果可以转换为expr1
,则返回false
;否则,返回expr2
。
这就是为什么它返回第一个值的原因:0
您期望结果为false
(布尔值),但是结果值的布尔值也是虚假的。这意味着您可以在条件(if
)中使用它,并具有预期的行为。
如果需要将其存储在变量中并且更喜欢具有布尔值,则可以对其进行转换。可以使用双重否定来完成:!!
!!(0 && true)
或使用Boolean
:
Boolean(0 && true)
答案 1 :(得分:2)
正如@MaximeChéramy指出的那样,JavaScript检查第一个元素是否返回false,而实际上不检查第二个元素。这样可以节省计算时间。
如果第一个语句为false,则JS不需要检查两个语句,它不会检查第二个语句,而只是返回第一个语句。再者,如果第一个为true,则不检查第二个,而是返回它。
数字,对象,数组或字符串是真实的。
使用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'