In Javascript, == “” evaluates to true. Why is it so?

后端 未结 8 1581
野性不改
野性不改 2020-12-13 22:18

If I do 0 == \"0\" it evaluates to true. Try,

if( -777 == \"-777\" ) alert(\"same\");

alert happens.

And, it\'s also noticeable th

相关标签:
8条回答
  • 2020-12-13 22:37

    The behavior of == is a bit lengthy, but clearly defined in the ecma-262 spec:

    11.9.3 The Abstract Equality Comparison Algorithm

    The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

    1. If Type(x) is different from Type(y), go to step 14.
    2. If Type(x) is Undefined, return true.
    3. If Type(x) is Null, return true.
    4. If Type(x) is not Number, go to step 11.
    5. If x is NaN, return false.
    6. If y is NaN, return false.
    7. If x is the same number value as y, return true.
    8. If x is +0 and y is −0, return true.
    9. If x is −0 and y is +0, return true.
    10. Return false.
    11. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
    12. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
    13. Return true if x and y refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, return false.
    14. If x is null and y is undefined, return true.
    15. If x is undefined and y is null, return true.
    16. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
    17. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.
    18. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
    19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
    20. If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
    21. If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
    22. Return false.

    Step 16 applies to your former example:

       0 == "0"            // apply 16
    ≡  0 == toNumber("0")
    ≡  0 == 0              // apply 7
    ≡  true
    

    And step 18, then step 16, apply to the latter:

       true == "true"            // apply 18
    ≡  toNumber(true) == "true"
    ≡  1 == "true"               // apply 16
    ≡  1 == toNumber("true")
    ≡  1 == NaN                  // apply 6
    ≡  false
    
    0 讨论(0)
  • 2020-12-13 22:41

    JavaScript has two sets of equality operators:

    • === and !== (strict equality operators)
    • == and != (standard equality operators)

    The standard equality operators will do the right comparison if both operands are the same type, but you can get some unexpected results if they're not the same type, for example:

    '' == '0' // false
    0 == '' // true
    0 == '0' // true
    false == 'false' // false
    false == '0' // true
    false == undefined // false
    false == null // false
    null == undefined // true
    ' \t\r\n ' == 0 // true
    

    For that I always recommend to use the strict equality operators (===, !==).

    0 讨论(0)
提交回复
热议问题