There are two operators for comparing values in JavaScript: strict equality === and “normal” (or lenient) equality ==. Many style guides (correctly) tell programmers to avoid lenient equality and always use strict equality. This post explains why.
Where appropriate, related sections in the ECMAScript 5 language specification [1] are mentioned in square brackets.
    NaN !== _  // any value including NaN
    x === x
    +0 === -0
  for any number x. Thus equality is not reflexive in
  JavaScript, because NaN is not equal to itself.
    > var a = NaN;
    > a === a
    false
    > var b = {}, c = {};
    > b === c
    false
    > b === b
    true
    > "abc" === new String("abc")
    false // different types (left: primitive, right: object)
    > 0 == false
    true
    > 1 == true
    true
    > 2 == true
    false
    > 2 ? true : false
    true // because 2 !== 0
Equality and strings:
    > "" == 0
    true
    > "123" == 123
    true
    > "" == false
    true
    > "1" == true
    true
    > "2" == true
    false
    > "true" == true
    false
    > "2" ? true : false
    true // because string is non-empty
    > "abc" == new String("abc")
    true // right side converted to primitive