具体而言(我不知道在其他情况下是否会发生这种情况),当我int(0) && boolean
myString.length && myString === "true"
myString = ""
时,它返回0
代替返回一个布尔值。
alert((function() {
var myString = "";
return myString.length && myString === "true";
})());
我知道我可以通过myString.length !== 0
或使用Boolean
进行修改来修复它。但我喜欢理解为什么&&
不强制将左侧强制转换为布尔值。
答案 0 :(得分:4)
JavaScript中的&&
运算符返回上次评估其子表达式操作数中的任何一个的实际值。在您的情况下,当.length
为0
时,该表达式是最后一个要评估的表达式,因为0
是“falsy”。
运算符执行对子表达式值的布尔值执行强制转换,但它只使用该结果来确定如何继续。因此&&
的总值不一定是布尔值;只有在评估的最后一个子表达式具有布尔结果时,它才是布尔值。
此JavaScript行为与C,C ++,Java等中类似运算符的行为明显不同。
答案 1 :(得分:3)
&&
运算符会产生左手值,如果它是false-y 1 ,否则产生右手值。 (与某些语言不同,不保证评估为真或假!)
A&&的TTL B:
A B (A && B)
false-y - A
truth-y - B
为了确保只返回 true或false,很容易应用(双重)否定:
return !!(myString.length && myString === "true")
或等同于
return !(!myString.length || myString !== "true")
这是否定TTL导致导出!!(false-y) => false
和!!(truth-y) => true
。
A !A !(!A)
false-y true false
truth-y false true
1 在JavaScript中,false-y值为false 0,“”,null,undefined,NaN。虽然其他一切都是真实的。