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

时间:2013-06-19 20:06:52

标签: javascript string operators

当我使用逻辑运算符&&两个字符串之间,为什么它给我第二个字符串作为输出:

console.log("" && "Dog");    // ""
console.log("Cat" && "Dog"); // "Dog"

我意识到除了0falsenullundefined""NaN之外,其他一切都是在如上所述的逻辑表达式中计算为布尔值true。但为什么输出是第二个字符串而不是第一个?为什么输出不仅仅是“真实”,因为它被评估为布尔表达式?

4 个答案:

答案 0 :(得分:22)

表达式

中的

"Cat" && "Dog"
// => "Dog"

因为您使用的是&&,JavaScript会向您承诺,它会验证表达式的两边都是true。在这种情况下,"Dog"只是最后评估的东西。

为了更明确,您可以执行类似

的操作
var c = "Cat" != null && "Dog" != null

这有点罗嗦,但归结为

var c = true && true
// => true

如果你想要一个布尔的简单快捷方式

var c = !!("Cat" && "Dog")
// => true

如果您只使用简单的REPL或JavaScript控制台,您将能够非常轻松地看到此输出。


根据以下评论之一

使用||,JavaScript承诺至少一个的边是true。由于“猫”是真的,它停在那里并返回“猫”。这称为Short-circuit evaluation

答案 1 :(得分:10)

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

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

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

  

生产 LogicalANDExpression LogicalANDExpression &&    BitwiseORExpression 评估如下:

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

答案 2 :(得分:8)

我认为这是因为逻辑运算符&&的性质。 Javascript以下列方式执行表达式"cat" && "Dog"

检查值“cat” - 它返回的内容不是“”,0,null,undefined或false,并且是真实的。 Javascript看到&&,所以它继续表达并面对字符串“Dog”,这不是“”,0,null,undefined或false,而且是真实的,表达式结束,表达式返回它检查的最后一个值。 / p>

如果您将&&替换为||,则表达式会以第一个truthy值结束,那就是

var boolean = "cat" || "dog"

返回第一个值:cat

答案 3 :(得分:0)

由于逻辑的工作方式,如果您需要测试两个项目是否都为真,并且已经知道第一个项目为真,那么测试完全取决于第二个项目。

true && someValue等效于someValue

因此,可以通过返回其操作数(而不是true / false值)并只测试第一个操作数而不是第二个操作数来处理运算符&&。

a && b:

  • 如果a的值为假,则无需进一步测试,请返回a(因为它为假)

  • 否则,如果a的值为true,则结果完全取决于b,因此只需返回b(无需测试b的值为true还是false,只需返回b)即可。

在代码中,这就像

function and(a,b) {
    if(!a) return a;
    return b;
}

类似地||可以定义为

function or(a,b) {
    if(a) return a;
    return b;
}

返回操作数而不是true / false具有一些优点:

  • 需要较少的评估(两种情况下都不会评估b)

  • 不需要true / false的定义,因此即使在跨语言或“ true”的值发生更改的情况下,它也可以更广泛地工作

  • 可以被“黑客”使用,而无需if,可以执行诸如string1 && string2之类的事情,它具有有用的含义:“如果string1不为空,则使用string2,否则将其保留为空(以替换字符串的每个单词一个带有文本“单词”的字符串:aString.split(" ").map(function(word) {return word && "word"});

JavaScripter喜欢这种东西(利用操作员的副作用脱离通常的情况来获得不同的意外行为),他们这样做是为了在聚会上炫耀语言知识。 :D