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

1dkrff03  于 2023-04-04  发布在  Java
关注(0)|答案(5)|浏览(119)

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

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

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

cvxl0en2

cvxl0en21#

在表达式中

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

因为你使用的是&&,JavaScript向你保证它会验证表达式的两边都是true。在这种情况下,"Dog"就是最后一个被求值的东西。
更明确地说,您可以执行以下操作

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

这有点罗嗦,但这可以归结为

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

如果你想要一个简单的boolean快捷方式,使用Boolean构造函数-

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

如果您只使用简单的REPL或JavaScript控制台,您将能够非常容易地看到此输出。
根据下面的一条评论
使用||,JavaScript向您保证至少有 * 一个 * 边是true。由于“Cat”为true,因此它在此停止并返回“Cat”。这被称为Short-circuit evaluation

vs91vp4v

vs91vp4v2#

我认为这是因为逻辑运算符&&的性质。Javascript以如下方式执行表达式"cat" && "Dog"
检查值“cat”-它返回的不是“",0,null,undefined或false,并且是truthy。Javascript看到&&,所以它继续表达式并面对字符串“Dog”,它不是“",0,null,undefined或false,并且是truthy,表达式结束,表达式返回它检查的最后一个值。
如果用||替换&&,表达式将以第一个truthy值结束,就是这样。

var boolean = "cat" || "dog"

返回第一个值:cat

yc0p9oo0

yc0p9oo03#

@naomik的回答几乎涵盖了它。如果你想深入了解,我建议你看看ECMAScript规范,第11.11节:
http://www.ecma-international.org/ecma-262/5.1/#sec-11.11
在“语义”部分,我们可以看到:
生产 LogicalANDExpressionLogicalANDExpression && BitwiseORExpression 的计算如下:
1.令 lref 为评估 LogicalANDExpression 的结果。
1.设 lval 为GetValue(lref)。
1.如果ToBoolean(lval)为false,则返回 lval
1.令 rref 为计算 BitwiseORExpression 的结果。
1.返回GetValue(rref)。

5anewei6

5anewei64#

由于逻辑的工作方式,如果您需要测试两项是否为真,并且您已经知道第一项为真,那么测试完全取决于第二项。
true && someValue等价于someValue
出于这个原因,可以通过返回操作数而不是真/假值来处理运算符&&,并且只测试第一个操作数而不是第二个操作数
a和B:

  • 如果a的值为false,不需要进一步测试,返回a(因为它是false)
  • 否则,如果a的计算结果为true,则结果完全取决于B,因此只需返回b(无需测试b的计算结果为true或false,只需返回它)

在代码中这就像

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,做像string 1 && string 2这样有有用意义的事情:“如果string 1不为空,则使用string 2,否则将其保持为空(将字符串中的每个单词替换为文本“word”:aString.split(" ").map(function(word) {return word && "word"});

JavaScript爱好者喜欢这类东西(利用一个操作符的副作用来获得一个不同的,意想不到的行为),他们这样做是为了在聚会上炫耀语言知识。

umuewwlo

umuewwlo5#

你可以做得更简单:
要验证字符串是否为空,您也可以在JavaScript中使用!操作符。

let a = '';
console.log(!a);  // => true

a = 'foo';
console.log(!a)   // => false

如果你再次使用这个操作符,现在你是在对布尔值求反,而不是对字符串求反。在你的例子中:

console.log(!!'' && !!'Dog');    // => false
console.log(!!'Cat' && !!'Dog'); // => true

你也可以看看这篇文章:Double negation (!!) in JavaScript - what is the purpose?

相关问题