6

0 == false両方とも'0' == false「真」です

しかし、(true && 0)は「偽」であり、一方(true && '0')は「真」です。

なんで?

4

2 に答える 2

6

抽象比較( ==) 規則はES5 11.9.3で説明されていますが、論理演算子 () の規則はES5 11.11&&で説明されています。

要するに、==は よりも複雑です&&&&内部を使用してそのオペランドを評価するだけでToBoolean()、、、および/または を==使用する可能性のあるさまざまな条件があります。ToBoolean()ToNumber()ToPrimitive()

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

    7. Type(y) が Boolean の場合、比較結果 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 ( )の場合は第 1 オペランドを返し、第 2 オペランドを返しますToBoolean(...) === false

    厳密には(true && 0) === 0

    また、if条件として使用すると、結果 ( 0) もandを介して渡さToBoolean(...)ToBoolean(0) === falseれます。

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

    繰り返しますが、これは 2 番目のオペランド を返します'0'

    ToBoolean('0') === trueただし、今回は、'0'空でない String であるため、trueになります。

また、より単純な比較規則が必要な場合は、厳密な比較を使用してください( ===, 11.9.6 )。

于 2013-06-27T02:21:48.733 に答える
-2

「0」(または任意の空でない文字列) は、JS では「真実」です。ただし、== 演算子はいくつかの奇妙な型強制を行うため、Crockford を含む多くの著名な JS 人物がそれを強く思いとどまらせています。これは、これを避けるべき理由の良い例です。これは、文字列 '0' を取り、それを誤った値に強制します。

このプロセスを説明するリンクは次のとおりです。

http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html

If Type(x) is Boolean, return the result of the comparison 
    ToNumber(x) == y: false == 0 and true == 1 but true != 2

あなたの例よりもさらに奇妙なのはこれです:

('1' == true) // true
('2' == true) // false!
于 2013-06-27T02:31:25.947 に答える