Ash*_*esh 27 javascript string operators
当我在两个字符串之间使用逻辑运算符&&时,为什么它会给我第二个字符串作为输出:
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"Run Code Online (Sandbox Code Playgroud)
我意识到有例外0,false,null,undefined,""和NaN,一切被评估为布尔在像上面的一个逻辑表达式真.但为什么输出是第二个字符串而不是第一个?为什么输出不仅仅是"真实",因为它被评估为布尔表达式?
Tha*_*you 26
在表达中
"Cat" && "Dog"
// => "Dog"
Run Code Online (Sandbox Code Playgroud)
因为你正在使用&&,JavaScript承诺你会验证表达式的两面都是true.在这种情况下,"Dog"是最后评估的东西.
更明确一点,你可以做点什么
var c = "Cat" != null && "Dog" != null
Run Code Online (Sandbox Code Playgroud)
它有点罗嗦,但归结为
var c = true && true
console.log(c)
// => true
Run Code Online (Sandbox Code Playgroud)
如果你想要一个布尔的简单快捷方式
var c = Boolean("Cat" && "Dog")
console.log(c)
// => true
Run Code Online (Sandbox Code Playgroud)
如果您只使用简单的REPL或JavaScript控制台,您将能够非常轻松地看到此输出.
根据以下评论之一
使用Boolean,JavaScript承诺至少有一方是||.由于"猫"是真的,它停在那里并返回"猫".这称为短路评估
Jos*_*uez 11
@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).
Mat*_*nen 10
我认为这是因为逻辑运算符&&的本质.Javascript "cat" && "Dog"以下列方式执行表达式:
检查值"cat" - 它返回除"",0,null,undefined或false之外的其他内容,并且是真实的.Javascript看到&&,所以它继续表达并面对字符串"Dog",这是"",0,null,undefined或false之外的东西,而且是真实的,表达式结束,表达式返回它检查的最后一个值.
如果你&&用||表达式替换,则以第一个truthy值结束
var boolean = "cat" || "dog"
Run Code Online (Sandbox Code Playgroud)
返回第一个值: cat