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

16

JavaScript是一种非严格类型的语言,就像Java一样。

众所周知,它根据上下文转换结果的值:

"2" + "3" 的结果是"23"

"2" * "3" 的结果是6

这很清楚,也很易于理解。

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

true && 1 的结果为 1
true || 1 的结果为 true

为什么第一个给出数字,而第二个给出布尔值?

考虑到 JavaScript 转换规则,由于表达式的布尔上下文,我期望在两种情况下都得到布尔值。

6个回答

9

翻译如下:

对于 quote MDC;

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

因此,在第一个示例中,返回 1,因为 expr1 无法转换为 false。

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


非常感谢,你提醒了我,Mozilla资源作为JavaScript文档非常有价值。 - sergionni

9

这与类型转换无关。

|| 返回第一个真值(truthy)操作数。 1 || true 将会返回 1

&& 返回第一个假值(falsy)操作数,或者如果两个操作数都为真值,则返回第二个操作数。

请参考 ECMAScript 规范 的第58页。


9

请查看道格拉斯·克罗克福德的网站,上面写道:

&& 运算符通常称为逻辑与。它也可以称为防护。如果第一个操作数为 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. */

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

value = v || 10; /* Use the value of v, but if v doesn't have a value,
use 10 instead. */

谢谢您的解释 - 关于 guard 和 default 的观点很有趣。 - sergionni
不用谢。总的来说,我建议阅读道格拉斯的JavaScript页面,而不是规范。在我看来,这样更容易理解。http://javascript.crockford.com/ - Tim Büthe
很棒的解释!我希望我能给你+3。 - Old Pro
@OldPro 嗯,谢谢,但功劳要归功于Douglas Crockford。 - Tim Büthe

2

0
你把类型转换(* / + 运算符会执行此操作)和逻辑运算(&&,||)混淆了。

0

你也可以做其他的事情,比如:

var myVar = Math.random() > 0.5;

myVar && doFunc();

这与...相同

if(myVar) {
    doFunc();
}

|| 基本上意味着“如果第一件事是假的,就去第二件事”

&& 基本上意味着“如果第一件事是真的,就去第二件事”

这就是为什么你会在函数顶部看到这样的东西:

function myFunction(options) {
    options = options || {};
}

这意味着:如果选项为假值,则将其设置为{}

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