In JavaScript, === (strict equality) is generally preferred over == (loose equality) because it checks both value and type without implicit type coercion. Below are detailed examples illustrating the differences:
1. Comparing Primitives
Example
== Result
=== Result
Explanation
"5" == 5
true
false
"5" (string) is coerced to 5 (number).
"5" === 5
false
false
Different types.
0 == false
true
false
false is coerced to 0 (number).
0 === false
false
false
Different types (number vs boolean).
"0" == false
true
false
Both coerced to 0 (string "0" → 0, false → 0).
null == undefined
true
false
Special case: null and undefined are only loosely equal.
NaN == NaN
false
false
NaN is not equal to itself in JavaScript. Use Object.is(NaN, NaN) instead.
2. Comparing Objects/Arrays
Example
== Result
=== Result
Explanation
[] == ""
true
false
Empty array [] is coerced to "" (string).
[] === ""
false
false
Different types (object vs string).
{} == "[object Object]"
true
false
Object coerced to "[object Object]" (string).
{} === {}
false
false
Different object instances (reference comparison).
3. Edge Cases
Example
== Result
=== Result
Explanation
"true" == true
false
false
"true" → NaN (number), true → 1 (number). NaN != 1.
"1" == true
true
false
"1" → 1, true → 1.
"\n" == 0
true
false
"\n" (string) → 0 (number).
" " == 0
true
false
Empty/whitespace strings coerce to 0.
When to Use == (Rare Cases)
Check for null or undefined:
if (value == null) { ... } // true if value is `null` or `undefined`
Intentional Type Coercion (e.g., user input as strings vs numbers):