为什么以下代码会产生a == 3
?
var x = "abc";
var y = 3;
var z = "xyz";
var a = x && y || z;
http://jsfiddle.net/thinkingmedia/qBZAL/
我原本希望这会产生a == true
。
为什么逻辑运算符会将"abc"
评估为true
,但不会将3
评估为true
。相反,它会产生3
作为结果。
此外,如果您更改y = 0
,则更改a == "xyz"
,这意味着&&
将0
视为false
。将数字视为数字会怎样?
这里有什么与逻辑运算符进行的对比?
答案 0 :(得分:15)
这是可以预期的。
在JavaScript(以及许多其他语言)中,不仅布尔本身本身也是假的,但其他对象也可能是真实的或假的(参见the docs on mdn):
如果需要,将值[...]转换为布尔值。如果值为[...]
0
,-0
,null
,false
,NaN
,undefined
或空字符串({{ 1}}),[它]是假的。所有其他值,包括任何对象或字符串""
,都会创建[...] true。
逻辑运算符"false"
和||
不会返回&&
或true
,而是返回最后一个参数来影响它们是真实还是虚假( reference):
false
- 如果可以转换为false,则返回expr1 && expr2
;否则,返回expr1
。因此,当与布尔值一起使用时,如果两个操作数都为真,则expr2
返回true;否则,返回false。&&
- 如果可以转换为true,则返回expr1 || expr2
;否则,返回expr1
。因此,当与布尔值一起使用时,如果任一操作数为真,则expr2
返回true;如果两者都为假,则返回false。
答案 1 :(得分:10)
第一步是评估"abc" && 3
。
false && 3
会返回false
,true && 3
会返回3
。“abc”不是假的,因此JavaScript采用第二部分,即3。
第二步是评估3 || "xyz"
。这里,JavaScript采用非空的第一个值,即3.这类似于C#中的this.firstObject ?? this.defaultValue
:第二部分仅在第一部分为空时才采用。
答案 2 :(得分:1)
副作用是你可以这样做:
x = x || {};
如果未设置变量,则将变量设置为默认值。
或者
TrackingManager && TrackingManager.track("user was here")
以避免笨重的if语句。