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

时间:2011-12-19 10:24:25

标签: javascript numbers boolean type-conversion

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

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

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

"2" * "3"结果6

这很清楚,可以理解。

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

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

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

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

6 个答案:

答案 0 :(得分:9)

quote MDC;

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

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

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

答案 1 :(得分:9)

这与类型转换无关。

||返回第一个真正的操作数。 1 || true会给您1

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

请参阅ECMAScript specification

的第58页

答案 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 =>这将始终返回第一个“真实”值

资源:

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

答案 4 :(得分:0)

你可以做其他事情:

var myVar = Math.random() > 0.5;

myVar && doFunc();

相同
if(myVar) {
    doFunc();
}

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

&&基本上意味着“如果第一件事情是真的,请转到第二个”

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

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

这意味着:如果选项为false,请将其设为{}

答案 5 :(得分:0)

你在使用逻辑评估(&&,||)做混乱(使用* / +运算符会这样做)。