当我使用逻辑运算符&&两个字符串之间,为什么它给我第二个字符串作为输出:
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"
我意识到除了0
,false
,null
,undefined
,""
和NaN
之外,其他一切都是在如上所述的逻辑表达式中计算为布尔值true。但为什么输出是第二个字符串而不是第一个?为什么输出不仅仅是“真实”,因为它被评估为布尔表达式?
答案 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 评估如下:
- 让 lref 成为评估 LogicalANDExpression 的结果。
- 让 lval 为GetValue( lref )。
- 如果ToBoolean( lval )为false,则返回 lval 。
- 让 rref 成为评估 BitwiseORExpression 的结果。
- 返回GetValue( rref )。
醇>
答案 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