例如,JavaScript是非严格类型的语言,如Java。
我们知道,它会根据上下文转换结果值:
"2" + "3"
结果"23"
"2" * "3"
结果6
这很清楚,可以理解。
我只是尝试了以下表达式而感到困惑:
true && 1
结果1
true || 1
结果true
为什么第一个给出Number而第二个给出布尔值?
考虑到JavaScript转换规则,由于boolean
表达式的上下文,我希望在这两种情况下都会得到boolean
值。
答案 0 :(得分:9)
&&amp ;; 如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&&如果两个操作数都为真,则返回true;否则,返回false。
的 || 强>;如果可以转换为true,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,||如果任一操作数为true,则返回true;如果两者都为假,则返回false。
因此,在第一个示例中,正在返回1
,因为expr1
无法转换为false。
在第二个示例中,true
可以转换为true,因此会返回。
答案 1 :(得分:9)
这与类型转换无关。
||
返回第一个真正的操作数。 1 || true
会给您1
&&
返回第一个假操作数,如果两个操作数都是真实的,则返回第二个操作数。
答案 2 :(得分:8)
检查Douglas Crockford's site,它说:
&&运算符通常称为逻辑运算符。它也可以被称为 守护。如果第一个操作数为false,则为null,undefined,“”(空 字符串),或数字0然后它返回第一个操作数。除此以外, 它返回第二个操作数。这提供了一种方便的编写方式 空检查:
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. */
答案 3 :(得分:2)
true && 1
=>这将始终返回&&的最后一个值如果所有条件都是真或假,否则
true || 1
=>这将始终返回第一个“真实”值
资源:
答案 4 :(得分:0)
你可以做其他事情:
var myVar = Math.random() > 0.5;
myVar && doFunc();
与
相同if(myVar) {
doFunc();
}
||
基本上意味着“如果第一件事是假的,请转到第二件”
&&
基本上意味着“如果第一件事情是真的,请转到第二个”
这就是为什么你在函数的顶部看到这样的东西:
function myFunction(options) {
options = options || {};
}
这意味着:如果选项为false,请将其设为{}
答案 5 :(得分:0)
你在使用逻辑评估(&&,||)做混乱(使用* / +运算符会这样做)。