逻辑运算符&&和javascript中的两个字符串

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承诺至少一方是||.由于"猫"是真的,它停在那里并返回"猫".这称为短路评估

  • @su,我在回答中添加了一个部分来解决您的问题:) (2认同)

Jos*_*uez 11

@naomik的回答几乎涵盖了它.如果你想深入,我建议你看一下ECMAScript规范,第11.11节:

http://www.ecma-international.org/ecma-262/5.1/#sec-11.11

在"语义学"部分,我们可以看到:

生产LogicalANDExpression:LogicalANDExpression && BitwiseORExpression的计算方法如下:

  1. lref成为评估LogicalANDExpression的结果.
  2. lval为GetValue(lref).
  3. 如果ToBoolean(lval)为false,则返回lval.
  4. rref是评估BitwiseORExpression的结果.
  5. 返回GetValue(rref).

  • 因为我刚刚发现它,并且认为我有一些额外的知识可以分享以前没有分享过;)我不认为问题在SO上有"失效日期":) (9认同)

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

  • +1是的,它真的归结为逻辑运算符101,不是吗?:)很好写. (2认同)