`==` x `===` e coerção de tipo
Pergunta
Qual a diferença entre `==` e `===` em JavaScript, e por que a recomendação é usar `===` quase sempre?
Resposta esperada
`===` (igualdade estrita) compara valor E tipo, sem conversão: `1 === '1'` é `false`. `==` (frouxa) converte os operandos pra um tipo comum antes de comparar, seguindo regras complicadas: `1 == '1'` é `true`, `0 == false` é `true`, `'' == 0` é `true`, `null == undefined` é `true` (mas `null == 0` é `false`), `[] == ''` é `true`, `NaN == NaN` é `false`. Essas regras são difíceis de lembrar e geram bugs sutis. Usa-se `===` por padrão; o único `==` amplamente aceito é `x == null` pra checar `null` OU `undefined` de uma vez. Pra converter de propósito, faça explícito (`Number(x)`, `String(x)`, `Boolean(x)`).
Por que perguntam isso
Pergunta júnior de JS. Sinal bom: citar `x == null` como o uso legítimo de `==` e 'converta explícito quando quiser converter'.