为什么`int(0)和boolean`返回`int(0)`而不是`boolean(false)`?

时间:2015-03-06 19:16:07

标签: javascript comparison

具体而言(我不知道在其他情况下是否会发生这种情况),当我int(0) && boolean myString.length && myString === "true" myString = ""时,它返回0代替返回一个布尔值。

alert((function() {
    var myString = "";
    return myString.length && myString === "true";
})());

我知道我可以通过myString.length !== 0或使用Boolean进行修改来修复它。但我喜欢理解为什么&&不强制将左侧强制转换为布尔值。

实例http://jsfiddle.net/uqma4ahm/1/

2 个答案:

答案 0 :(得分:4)

JavaScript中的&&运算符返回上次评估其子表达式操作数中的任何一个的实际值。在您的情况下,当.length0时,该表达式是最后一个要评估的表达式,因为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。虽然其他一切都是真实的。