为什么在JavaScript中,"0 && true"返回0而不是布尔值?

18

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

0 && true
> 0

为什么会这样?在这种情况下,我如何处理JavaScript中的逻辑表达式以避免将来出现这种错误?

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

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

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

也许有一些聪明的原因解释这样做的必要性,但我不太喜欢。


1
JavaScript中的逻辑运算符执行短路求值 - Some programmer dude
1
你可以使用 !!0 将其转换为布尔值。 - Chris Li
1
你能展示一个会出错的例子吗?如果没有完整的例子,很难知道如何以正确的方式执行。0 && true 的计算结果为 0,因为 0 是表达式中第一个 falsy 部分,所以在 if 语句中它可以正常工作。 - t.niese
@工具 是的,如果API根据传递值的类型决定要执行什么操作,那么这肯定会是一个问题。特别是在像jQuery切换这样的情况下,它可以是布尔值或数字值。因此,在这种情况下,您需要使用!!(0&&true)Boolean(0&&true)方法。 - t.niese
1
@t.niese 是的,我认为问题不在于JS,而是在于 .toggle,因为它接受各种值。如果你传递一个布尔值,那么你要么显示要么隐藏元素。传递一个数字会设置延迟时间。传递一个字符串则会被视为数字。传递一个对象则会被视为设置。传递 undefined 相当于只调用 .toggle() 而没有参数。完成后会执行一个函数。如果你传入 null ,我不知道会发生什么 - 可能会被视为 false...或者一个对象。这很复杂。 - VLAZ
显示剩余5条评论
2个回答

24
关于&&运算符的文档说明:

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) 或者使用BooleanBoolean(0 && true)

1
你没有解释如何防止这个错误 - Jaromanda X

3

正如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'

2
我认为 OP 知道它是如何工作的... 他想知道如何“防止”这样的错误。 - Jaromanda X
2
我不知道提问者是否了解它的工作原理,否则他们可能不会这样问问题。而且,即使提问者知道,那么其他人呢?如果有人偶然看到这个问题,他们该怎么办? - VLAZ
已编辑。谢谢 :) - Daut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接