What is the difference between == and ===? When does coercion produce surprising results?
Knowing coercion rules and why strict equality should be the default.
=== (strict) compares type and value with no conversion; == (loose) coerces both operands to a common type first, which produces surprises: 0 == '' and 0 == '0' are true, '' == '0' is false, [] == false is true, and null == undefined is true (but neither == 0). Rule of thumb: always use === / !==. The one pragmatic exception many teams allow is x == null, which is true for exactly null and undefined — a concise nullish check. Also memorize the standalone gotchas: NaN === NaN is false (use Number.isNaN), typeof null is 'object', and objects/arrays compare by reference, not by contents, so {} !== {}. For structural comparison, compare fields explicitly or serialize.
'What does this evaluate to' trivia, defensive null checks, and code review of equality logic.