JS Type Conversions — The Complete Reference

Every JavaScript type conversion in one place: boxing/unboxing, string/number/boolean coercion, character codes, array/object/JSON transforms, implicit rules, and Symbol.toPrimitive.

12 min read
JavaScript
Fundamentals
Types
Coercion

TABLE OF CONTENTS

JavaScript has seven primitive types and one object type. Every conversion you'll ever need — explicit, implicit, boxed, unboxed — is covered here.


1. Primitive → Object (Boxing)

Object() wraps any primitive in its object equivalent. JavaScript does this automatically when you call a method on a primitive (e.g. "hi".toUpperCase()).

Loading editor...

Use Object() in polyfills to handle primitive this contexts — this is what native call/apply do internally.


2. Object → Primitive (Unboxing)

Unwrap an object wrapper back to its primitive using .valueOf(), or let coercion do it implicitly.

Loading editor...


3. → String

Loading editor...

Gotcha: null.toString() throws — String(null) never does.


4. → Number

Loading editor...

MethodStops at non-digitHandles floatsHandles hexHandles ""
Number()No (→ NaN)YesNo→ 0
parseInt()YesNo (truncates)Yes (with radix)→ NaN
parseFloat()YesYesNo→ NaN
Unary +No (→ NaN)YesNo→ 0

5. → Boolean

Loading editor...

Interview pattern: Use !!value when you need a boolean for a condition. Use Boolean(value) when readability matters.


6. Character ↔ Number (ASCII / Unicode)

Loading editor...


7. Array ↔ String

Loading editor...


8. Object ↔ Array

Loading editor...


9. JSON Conversions

Loading editor...


10. Implicit Coercion — The Hidden Rules

Loading editor...


11. Symbol.toPrimitive — Custom Conversion

Override how an object converts with Symbol.toPrimitive:

Loading editor...

Without Symbol.toPrimitive, JS calls valueOf() first, then toString().


Quick Reference

From → ToMethodEdge case
any → stringString(x) or `${x}`String(Symbol()) works; Symbol().toString() works; template literal throws
string → numberNumber(x)Number("") → 0, Number(" ") → 0
string → integerparseInt(x, 10)Always pass radix 10
string → floatparseFloat(x)Stops at first non-numeric char
any → booleanBoolean(x) or !!x[] and {} are truthy
any → objectObject(x)null/undefined{}
char → codestr.charCodeAt(0)Use codePointAt for emoji
code → charString.fromCharCode(n)Use fromCodePoint for emoji
array → stringarr.join(sep)Default sep is ","
string → arraystr.split("")Or [...str] or Array.from(str)
object → entriesObject.entries(obj)Keys are always strings
entries → objectObject.fromEntries(arr)Also accepts Map
object/array → JSONJSON.stringify(x)Drops functions, symbols, undefined
JSON → object/arrayJSON.parse(str)Throws on invalid JSON

Related Articles


Let's Connect

© 2026 Naveen Karthik // Built with React & MUI