frontend
Type Conversion and Type Coercion in JavaScript
January 4, 2026
Type Conversion and Type Coercion in JavaScript
Overview
JavaScript is a dynamically typed language, meaning variables can change types. Type Conversion (explicit) is when you manually convert types, while Type Coercion (implicit) is when JavaScript automatically converts types.
Type Coercion (Implicit Conversion)
Type coercion happens automatically when JavaScript needs to convert values to perform operations.
String Coercion
console.log(1 + "2"); // "12" (number coerced to string)
console.log("2" + undefined); // "2undefined"
console.log("2" + NaN); // "2NaN"
console.log("Hello" + 5); // "Hello5"
Number Coercion
console.log("2" * 2); // 4 (string coerced to number)
console.log("2" - 1); // 1
console.log("10" / 2); // 5
console.log("5" - "3"); // 2
console.log("Hello" - "hello"); // NaN
Boolean Coercion
// Falsy values (coerce to false)
console.log(Boolean(0)); // false
console.log(Boolean("")); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(false)); // false
// Truthy values (coerce to true)
console.log(Boolean(1)); // true
console.log(Boolean("0")); // true
console.log(Boolean([])); // true
console.log(Boolean({})); // true
Comparison Coercion
console.log(1 == "1"); // true (coercion)
console.log(1 === "1"); // false (strict, no coercion)
console.log(null == undefined); // true
console.log(null === undefined); // false
console.log(0 == false); // true
console.log(0 === false); // false
Type Conversion (Explicit Conversion)
Type conversion is when you manually convert types using functions or methods.
String Conversion
// String() constructor
console.log(String(1 + 2)); // "3"
console.log(String(undefined)); // "undefined"
console.log(String(null)); // "null"
console.log(String(true)); // "true"
// .toString() method
console.log((123).toString()); // "123"
console.log(true.toString()); // "true"
// null.toString(); // TypeError
// undefined.toString(); // TypeError
Number Conversion
// Number() constructor
console.log(Number("123")); // 123
console.log(Number("123.45")); // 123.45
console.log(Number("abc")); // NaN
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
// parseInt() - parses integer
console.log(parseInt("123")); // 123
console.log(parseInt("123.45")); // 123
console.log(parseInt("123abc")); // 123
// parseFloat() - parses floating point
console.log(parseFloat("123.45")); // 123.45
console.log(parseFloat("123.45abc")); // 123.45
// Unary plus operator
console.log(+"123"); // 123
console.log(+"123.45"); // 123.45
Boolean Conversion
// Boolean() constructor
console.log(Boolean(0)); // false
console.log(Boolean(1)); // true
console.log(Boolean("")); // false
console.log(Boolean("0")); // true
console.log(Boolean([])); // true
console.log(Boolean({})); // true
// Double negation (!!)
console.log(!!0); // false
console.log(!!1); // true
console.log(!!""); // false
Object to Primitive Conversion
// valueOf() and toString()
const obj = {
valueOf() {
return 42;
},
toString() {
return "forty-two";
}
};
console.log(String(obj)); // "forty-two" (toString)
console.log(Number(obj)); // 42 (valueOf)
console.log(obj + ""); // "forty-two" (string context)
console.log(+obj); // 42 (number context)
Common Coercion Scenarios
Addition vs Other Operators
// Addition coerces to string
console.log(1 + "2"); // "12"
console.log(1 + 2); // 3
// Other operators coerce to number
console.log("2" * 2); // 4
console.log("2" - 1); // 1
console.log("2" / 2); // 1
Loose vs Strict Equality
// Loose equality (==) - allows coercion
console.log(1 == "1"); // true
console.log(0 == false); // true
console.log(null == undefined); // true
console.log("" == 0); // true
// Strict equality (===) - no coercion
console.log(1 === "1"); // false
console.log(0 === false); // false
console.log(null === undefined); // false
console.log("" === 0); // false
Array Coercion
console.log([] + []); // "" (empty string)
console.log([] + {}); // "[object Object]"
console.log({} + []); // "[object Object]"
console.log([1, 2] + [3, 4]); // "1,23,4"
Best Practices
- Use strict equality (
===): Avoids unexpected coercion - Explicit conversion: Use
Number(),String(),Boolean()when needed - Be aware of falsy values: Understand what coerces to false
- Check types explicitly: Use
typeofwhen needed
// Good: Explicit conversion
const num = Number(userInput);
if (isNaN(num)) {
console.error("Invalid number");
}
// Good: Strict equality
if (value === null) {
// handle null
}
// Avoid: Relying on coercion
if (value == null) { // Also matches undefined
// might not be what you want
}
Key Points
- Type Coercion: Automatic, implicit conversion by JavaScript
- Type Conversion: Manual, explicit conversion by developer
- Coercion happens in operations like
+,==, comparisons - Use strict equality (
===) to avoid unexpected coercion - Explicit conversion with
Number(),String(),Boolean()is clearer - Understand falsy values:
0,"",null,undefined,NaN,false