当我在两个字符串之间使用逻辑运算符&&时,为什么它会给我第二个字符串作为输出:
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"
我意识到有例外0
,false
,null
,undefined
,""
和NaN
,一切被评估为布尔在像上面的一个逻辑表达式真.但为什么输出是第二个字符串而不是第一个?为什么输出不仅仅是"真实",因为它被评估为布尔表达式?
在表达中
"Cat" && "Dog" // => "Dog"
因为你正在使用&&
,JavaScript承诺你会验证表达式的两面都是true
.在这种情况下,"Dog"
是最后评估的东西.
更明确一点,你可以做点什么
var c = "Cat" != null && "Dog" != null
它有点罗嗦,但归结为
var c = true && true console.log(c) // => true
如果你想要一个布尔的简单快捷方式
var c = Boolean("Cat" && "Dog") console.log(c) // => true
如果您只使用简单的REPL或JavaScript控制台,您将能够非常轻松地看到此输出.
根据以下评论之一
使用Boolean
,JavaScript承诺至少有一方是||
.由于"猫"是真的,它停在那里并返回"猫".这称为短路评估
@naomik的回答几乎涵盖了它.如果你想深入,我建议你看一下ECMAScript规范,第11.11节:
http://www.ecma-international.org/ecma-262/5.1/#sec-11.11
在"语义学"部分,我们可以看到:
生产LogicalANDExpression:LogicalANDExpression && BitwiseORExpression的计算方法如下:
让lref成为评估LogicalANDExpression的结果.
设lval为GetValue(lref).
如果ToBoolean(lval)为false,则返回lval.
设rref是评估BitwiseORExpression的结果.
返回GetValue(rref).
我认为这是因为逻辑运算符&&的本质.Javascript "cat" && "Dog"
以下列方式执行表达式:
检查值"cat" - 它返回除"",0,null,undefined或false之外的其他内容,并且是真实的.Javascript看到&&
,所以它继续表达并面对字符串"Dog",这是"",0,null,undefined或false之外的东西,而且是真实的,表达式结束,表达式返回它检查的最后一个值.
如果你&&
用||
表达式替换,则以第一个truthy值结束
var boolean = "cat" || "dog"
返回第一个值: cat