DEV Community

Saboor Bhutta
Saboor Bhutta

Posted on

JavaScript’s not-so-obvious type coercion examples

JavaScript’s type coercion and dynamic typing system are full of subtle (and sometimes surprising) behaviors. Understanding these quirks can make you much more confident and effective as a JS developer.

Here’s a list of not-so-obvious JavaScript type coercion examples, grouped into categories with explanations:

1. String vs Number Comparison

Expression Value Reason
'10' < '2' true Lexicographic comparison: '1' comes before '2'
'10' < 2 false string '10' is coerced to number 10
'5' == 5 true string '5' is coerced to number 5
'5' === 5 false strict equality, no type coercion
Rule: Loose equality (==) allows type coercion. Strict equality (===) does not.

2. Falsy Values

JavaScript has falsy values that act like false in boolean contexts:

Expression Value
Boolean(' ') false
Boolean(0) false
Boolean(null) false
Boolean(undefined) false
Boolean(NaN) false
Boolean([]) true
Boolean({}) true
Note: [] and {} are truthy, even though they're empty.

3. Array and Object Coercion

Expression Value Reason
[] + [] ' ' both arrays are coerced to strings → ' ' + ' '
[] + {} '[object Object]' [] → ' ', {} → '[object Object]'
' ' + '[object Object]' → '[object Object]'
[] == false true [] → ' ' → ' ' == false → true
[0] == false true [0] → '0' → 0 == false → true
[1,2] + [3,4] '1,23,4' arrays are stringified → '1,2' + '3,4'

4. Arithmetic with Non-numbers

Expression Value Reason
'5' - 2 3 '5' is coerced to number
'5' + 2 '52' '+' triggers string concatenation
null + 1 1 null → 0
undefined + 1 NaN undefined → NaN
true + 1 2 true → 1
false + 1 1 false → 0
"abc" * 33 NaN Cannot coerce "abc" to Number → NaN
33 / 0 Infinity Division by zero → Infinity
0 / 0 NaN Undefined division → NaN
Note: The + operator behaves differently depending on whether one side is a string — it prefers string concatenation over numeric addition.

5. Equality Weirdness

Expression Value Reason
null == undefined true only loosely equal to each other
null === undefined false different types
[] == ' ' true [] → ' '
[null] == ' ' true [null] → ' '
[undefined] == ' ' true [undefined] → ' '
{} == {} OR [] == [] false different references
NaN == NaN false NaN is not equal to anything, even itself

6. typeof Quirks

Expression Value Reason
typeof null 'object' Legacy bug in JavaScript
typeof NaN 'number' NaN is actually a special kind of number
typeof [] , typeof {} 'object' Arrays are objects too
typeof function(){} 'function' Functions are a special kind of object

Best Practices

  • Always use === instead of == unless you're very sure about coercion.
  • Use Number(), Boolean(), or String() explicitly when converting types.
  • For checking arrays: Array.isArray(value)
  • For checking NaN: Number.isNaN(value) or Object.is(value, NaN)

Top comments (0)