0与'0'一起使用布尔运算符

pau*_*hap 6 javascript boolean-expression boolean-operations

0 == false并且'0' == false都'真'

然而,(true && 0)是'假',而(true && '0')'是'.

为什么?

Jon*_*ski 6

抽象比较(==)的规则中描述ES5 11.9.3而对于逻辑运算规则(&&)中描述ES5 11.11.

简而言之,==只是比它更复杂&&.当&&只使用内部ToBoolean()评估其操作数,==有可能导致在使用的各种条件ToBoolean(),ToNumber()和/或ToPrimitive().

  1. (0 == false) == true:

    7.如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)

    ToNumber(false) === 0所以0 == 0,所以true.

  2. ('0' == false) == true:

    这也通过了第7步,结果是'0' == 0.

    然后,从顶部开始,它到达第5步:

    5.如果Type(x)是String而Type(y)是Number,则返回比较结果ToNumber(x)== y.

    ToNumber('0') === 0,又一次0 == 0又一次true.

  3. !!(true && 0) == false

    &&如果它是falsy(ToBoolean(...) === false)或第二个操作数,则返回第一个操作数.

    这是严格的(true && 0) === 0.

    并且,当用作if条件时,result(0)也将通过ToBoolean(...)传递ToBoolean(0) === false.

  4. !!(true && '0') == true

    再次,这返回第二个操作数,'0'.

    然而这一次,ToBoolean('0') === true因为'0'是一个非空的字符串,使其truthy.

此外,如果您想要更简单的比较规则,请使用严格比较(===,11.9.6).