JavaScript是一种非严格类型的语言,就像Java一样。
众所周知,它根据上下文转换结果的值:
"2" + "3"
的结果是"23"
"2" * "3"
的结果是6
这很清楚,也很易于理解。
我尝试了以下表达式,并感到困惑:
true && 1
的结果为 1
true || 1
的结果为 true
为什么第一个给出数字,而第二个给出布尔值?
考虑到 JavaScript 转换规则,由于表达式的布尔上下文,我期望在两种情况下都得到布尔值。
JavaScript是一种非严格类型的语言,就像Java一样。
众所周知,它根据上下文转换结果的值:
"2" + "3"
的结果是"23"
"2" * "3"
的结果是6
这很清楚,也很易于理解。
我尝试了以下表达式,并感到困惑:
true && 1
的结果为 1
true || 1
的结果为 true
为什么第一个给出数字,而第二个给出布尔值?
考虑到 JavaScript 转换规则,由于表达式的布尔上下文,我期望在两种情况下都得到布尔值。
翻译如下:
对于 quote MDC;
&&; 如果可以转换为 false,则返回 expr1;否则返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为 true,则 && 返回 true;否则返回 false。
||; 如果可以转换为 true,则返回 expr1;否则返回 expr2。因此,当与布尔值一起使用时,如果任一操作数为 true,则 || 返回 true;如果两个操作数都为 false,则返回 false。
因此,在第一个示例中,返回 1
,因为 expr1
无法转换为 false。
在第二个示例中,true
可以转换为 true,因此被返回。
这与类型转换无关。
||
返回第一个真值(truthy)操作数。 1 || true
将会返回 1
&&
返回第一个假值(falsy)操作数,或者如果两个操作数都为真值,则返回第二个操作数。
请参考 ECMAScript 规范 的第58页。
请查看道格拉斯·克罗克福德的网站,上面写道:
&& 运算符通常称为逻辑与。它也可以称为防护。如果第一个操作数为 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. */
true && 1
=> 如果所有条件都为真,则始终返回&&的最后一个值,否则返回false
true || 1
=> 始终返回第一个'truthy'值你也可以做其他的事情,比如:
var myVar = Math.random() > 0.5;
myVar && doFunc();
这与...相同
if(myVar) {
doFunc();
}
||
基本上意味着“如果第一件事是假的,就去第二件事”
&&
基本上意味着“如果第一件事是真的,就去第二件事”
这就是为什么你会在函数顶部看到这样的东西:
function myFunction(options) {
options = options || {};
}
{}
。