JavaScript类型转换:(true && 1)vs(true | | 1)

ser*_*nni 16 javascript boolean numbers type-conversion

例如,JavaScript是非严格类型的语言,如Java.

我们知道,它根据上下文转换结果的值:

"2" + "3" 结果 "23"

"2" * "3" 结果 6

这很清楚,可以理解.

我只是尝试了以下表达式并感到困惑:

true && 1结果1
true || 1结果true

为什么第一个给出Number而第二个给出布尔值?

考虑到JavaScript转换规则,boolean由于boolean表达式的上下文,我希望在这两种情况下获得值.

Mat*_*att 9

引用MDC ;

&&; 如果可以转换为false,则返回expr1; 否则,返回expr2.因此,当与布尔值一起使用时,如果两个操作数都为真,则&&返回true; 否则,返回false.
|| ; 如果可以转换为true,则返回expr1; 否则,返回expr2.因此,当与布尔值一起使用时,|| 如果任一操作数为true,则返回true; 如果两者都为假,则返回false.

所以在第一个例子中,1正在返回因为expr1无法转换为false.

在第二个示例中,true可以转换为true,因此返回.


Pau*_*her 9

这与类型转换无关.

||返回第一个truthy操作数. 1 || true会给你1

&& 返回第一个假操作数,如果两个操作数都是真实的,则返回第二个操作数.

请参阅ECMAScript规范的第58页


Tim*_*the 8

查看Douglas Crockford的网站,它说:

&&运算符通常称为逻辑和.它也可以称为守卫.如果第一个操作数为false,null,undefined,""(空字符串)或数字0则返回第一个操作数.否则,它返回第二个操作数.这提供了一种编写null检查的便捷方法:

var value = p && p.name; /* The name value will only be retrieved from
p if p has a value, avoiding an error. */
Run Code Online (Sandbox Code Playgroud)

|| 运算符通常称为逻辑或.它也可以称为默认值.如果第一个操作数为false,null,undefined,""(空字符串)或数字0,则返回第二个操作数.否则,它返回第一个操作数.这提供了一种指定默认值的便捷方法:

value = v || 10; /* Use the value of v, but if v doesn't have a value,
use 10 instead. */
Run Code Online (Sandbox Code Playgroud)