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
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 }