ES6+easy

`==` vs `===` — type coercion rules

What is the difference between `==` (loose equality) and `===` (strict equality)? Give examples of surprising `==` coercion behaviour.

Asked at Amazon, Google

#coercion#equality#types

Answer

// Usage
// === strict equality: no type coercion
1 === 1        // true
1 === '1'      // false — different types
null === null  // true
null === undefined // false

// == loose equality: coerces types (follow Abstract Equality algo)
1 == '1'       // true  (string → number)
0 == false     // true  (false → 0)
0 == ''        // true  ('' → 0)
null == undefined  // true  (special rule)
null == 0      // false (null only == undefined)
NaN == NaN     // false (NaN is never equal to anything)

// Surprising cases
[] == false    // true  ([] → '' → 0, false → 0)
[] == ![]      // true  (![] is false, [] coerces to 0)
'' == false    // true

// Rule of thumb: always use ===
// Exceptions: null == undefined is a common idiom to check
// for "neither null nor undefined" in one check:
function isNullish(val) {
  return val == null  // catches both null and undefined
}

Practise more ES6+ questions →