Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / web / HTML

Javascript Operators === & !==

4.33/5 (3 votes)
10 Mar 2011CPOL2 min read 9.2K  
The algorithm behind the EqualityExpression (==,===, !=, !==) is a bit more complex than what is portrayed in some of the other alternates and comments, and a correct understanding of this actually quite important in order to avoid unforeseen errors in javascript programs.The short story is...
The algorithm behind the EqualityExpression (==,===, !=, !==) is a bit more complex than what is portrayed in some of the other alternates and comments, and a correct understanding of this actually quite important in order to avoid unforeseen errors in javascript programs.

The short story is that the equality operators will always compare values of identical types, and if the original operands are not equal, then an algorithm is used to coerce one of the values to the other.

If you want a good explanation of all of this, then take a look here[^]

Regarding the algorithm, here is the formal explanation from the ECMAScript 262-3[^]/5 spec:

11.9.1 The Equals Operator ( == )
The production EqualityExpression : EqualityExpression == RelationalExpression is evaluated as follows:

  1. Evaluate EqualityExpression.
  2. Call GetValue(Result(1)).
  3. Evaluate RelationalExpression.
  4. Call GetValue(Result(3)).
  5. Perform the comparison Result(4) == Result(2). (see 11.9.3).
  6. Return Result(5).


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.- 5 6 -
  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

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)