当我在两个字符串之间使用逻辑运算符&&时,为什么它会给予我第二个字符串作为输出:
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"
我意识到除了0
,false
,null
,undefined
,""
和NaN
之外,其他所有的东西在上面的逻辑表达式中都被计算为布尔值true。但是为什么输出是第二个字符串而不是第一个?为什么输出不只是“true”,因为它被计算为布尔表达式?
当我在两个字符串之间使用逻辑运算符&&时,为什么它会给予我第二个字符串作为输出:
console.log("" && "Dog"); // ""
console.log("Cat" && "Dog"); // "Dog"
我意识到除了0
,false
,null
,undefined
,""
和NaN
之外,其他所有的东西在上面的逻辑表达式中都被计算为布尔值true。但是为什么输出是第二个字符串而不是第一个?为什么输出不只是“true”,因为它被计算为布尔表达式?
5条答案
按热度按时间cvxl0en21#
在表达式中
因为你使用的是
&&
,JavaScript向你保证它会验证表达式的两边都是true
。在这种情况下,"Dog"
就是最后一个被求值的东西。更明确地说,您可以执行以下操作
这有点罗嗦,但这可以归结为
如果你想要一个简单的boolean快捷方式,使用
Boolean
构造函数-如果您只使用简单的REPL或JavaScript控制台,您将能够非常容易地看到此输出。
根据下面的一条评论
使用
||
,JavaScript向您保证至少有 * 一个 * 边是true
。由于“Cat”为true,因此它在此停止并返回“Cat”。这被称为Short-circuit evaluationvs91vp4v2#
我认为这是因为逻辑运算符&&的性质。Javascript以如下方式执行表达式
"cat" && "Dog"
:检查值“cat”-它返回的不是“",0,null,undefined或false,并且是truthy。Javascript看到
&&
,所以它继续表达式并面对字符串“Dog”,它不是“",0,null,undefined或false,并且是truthy,表达式结束,表达式返回它检查的最后一个值。如果用
||
替换&&
,表达式将以第一个truthy值结束,就是这样。返回第一个值:
cat
yc0p9oo03#
@naomik的回答几乎涵盖了它。如果你想深入了解,我建议你看看ECMAScript规范,第11.11节:
http://www.ecma-international.org/ecma-262/5.1/#sec-11.11
在“语义”部分,我们可以看到:
生产 LogicalANDExpression:LogicalANDExpression && BitwiseORExpression 的计算如下:
1.令 lref 为评估 LogicalANDExpression 的结果。
1.设 lval 为GetValue(lref)。
1.如果ToBoolean(lval)为false,则返回 lval。
1.令 rref 为计算 BitwiseORExpression 的结果。
1.返回GetValue(rref)。
5anewei64#
由于逻辑的工作方式,如果您需要测试两项是否为真,并且您已经知道第一项为真,那么测试完全取决于第二项。
true && someValue等价于someValue
出于这个原因,可以通过返回操作数而不是真/假值来处理运算符&&,并且只测试第一个操作数而不是第二个操作数
a和B:
在代码中这就像
相似算子||可定义为
返回操作数而不是true/false有几个优点:
aString.split(" ").map(function(word) {return word && "word"});
JavaScript爱好者喜欢这类东西(利用一个操作符的副作用来获得一个不同的,意想不到的行为),他们这样做是为了在聚会上炫耀语言知识。
umuewwlo5#
你可以做得更简单:
要验证字符串是否为空,您也可以在JavaScript中使用!操作符。
如果你再次使用这个操作符,现在你是在对布尔值求反,而不是对字符串求反。在你的例子中:
你也可以看看这篇文章:Double negation (!!) in JavaScript - what is the purpose?