The == operator compares values after type coercion:
5 == "5" // true (string converts to number)
0 == false // true (false converts to 0)
null == undefined // true (special case)
This seems convenient but causes unexpected results:
"" == 0 // true
"0" == false // true
[] == false // true
These rules are hard to remember and lead to bugs. Most experienced developers avoid == entirely.