35

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

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

我意识到除了0, false, null, undefined, ""and之外NaN,其他所有内容在上述逻辑表达式中都被评估为布尔值 true。但是为什么输出是第二个字符串而不是第一个?为什么输出不只是“真”,因为它被评估为布尔表达式?

4

4 回答 4

35

在表达式中

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

因为您正在使用&&,所以 JavaScript 向您保证它将验证表达式的两边都是true. 在这种情况下,"Dog"是最后一个被评估的东西。

更明确地说,你可以做类似的事情

var c = "Cat" != null && "Dog" != null

它有点罗嗦,但这归结为

var c = true && true
console.log(c)
// => true

如果您想要一个简单的布尔快捷方式,请使用Boolean构造函数 -

var c = Boolean("Cat" && "Dog")
console.log(c)
// => true

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


根据以下评论之一

使用||,JavaScript 向您保证,至少其中之一true. 由于“Cat”为真,它停在那里并返回“Cat”。这称为短路评估

于 2013-06-19T20:09:58.127 回答
12

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

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

如果你&&||表达式替换以第一个真实值结束,那就是这样

var boolean = "cat" || "dog"

返回第一个值:cat

于 2013-06-19T20:19:13.393 回答
12

@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 ) 为假,则返回lval
  4. rref为评估BitwiseORExpression的结果。
  5. 返回 GetValue( rref )。
于 2016-08-18T18:46:00.520 回答
0

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

true && someValue 仅相当于 someValue

出于这个原因,运算符 && 可以通过返回其操作数而不是真/假值来处理,并且只测试第一个操作数而不是第二个操作数

一个 && 乙:

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

  • 否则,如果 a 计算结果为真,结果完全取决于 b,所以只需返回 b(无需测试 b 计算结果为真或假,返回即可)

在代码中,这就像

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

类似运算符 || 可以定义为

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

返回操作数而不是 true/false 有几个优点:

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

  • 不需要对真/假的定义,因此它可以更广泛地工作,甚至跨语言或如果“真”的值发生变化

  • 可以在没有 if 的情况下被“破解”来执行诸如 string1 && string2 之类的具有有用含义的操作:“如果 string1 不为空,请使用 string2,否则将其保留为空(用文本替换字符串的每个单词”单词”:aString.split(" ").map(function(word) {return word && "word"});

JavaScript 开发者喜欢这种东西(在通常的上下文中利用一个运算符的副作用来获得不同的、意想不到的行为),他们这样做是为了在聚会上炫耀语言知识。:D

于 2019-09-01T08:49:44.423 回答