DEV Community

Ashish Ghildiyal
Ashish Ghildiyal

Posted on

Natives vs Boxing Wrappers in JavaScript

In JavaScript, you work with primitive values (like strings, numbers) but still call methods on them.
That's possible because of boxing (wrapper objects).

🎯 1. What are Natives?

Natives = built-in types and functions provided by JavaScript
πŸ”Ή Primitive (Native Types)

"hello"   // string
42        // number
true      // boolean
null
undefined
Symbol()
BigInt(10)
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ These are primitive values
πŸ‘‰ They are not objects

πŸ”Ή Object Natives

Object
Array
Function
Date
RegExp
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ These are actual objects / constructors
🧩 2. The Problem

Primitives are not objects, so:

let str = "hello";
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ This should NOT work:

str.toUpperCase(); // ❓ how?
Enter fullscreen mode Exit fullscreen mode

Because:

"hello" is NOT an object
Enter fullscreen mode Exit fullscreen mode

βš™οΈ 3. What is Boxing (Wrapper Objects)?

Boxing = temporarily converting a primitive into an object so you can use methods

πŸ”¬ Behind the Scene

let str = "hello";
str.toUpperCase();
Enter fullscreen mode Exit fullscreen mode

Internally becomes:

new String("hello").toUpperCase();
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ JS engine automatically wraps the primitive

🧠 This is called Autoboxing

πŸ” Full Internal Flow

Primitive β†’ Wrapper Object β†’ Method Call β†’ Discard Wrapper
Enter fullscreen mode Exit fullscreen mode

πŸ§ͺ Example

let num = 10;
num.toFixed(2);
Enter fullscreen mode Exit fullscreen mode

Internally:

new Number(10).toFixed(2);
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Then wrapper is destroyed

βš™οΈ 4. Types of Wrapper Objects

🧩 5. Important Difference

Primitive

let a = "hello";
Enter fullscreen mode Exit fullscreen mode

Wrapper Object

let b = new String("hello");
Enter fullscreen mode Exit fullscreen mode

⚠️ These are NOT the same

typeof a // "string"
typeof b // "object"
Enter fullscreen mode Exit fullscreen mode

⚠️ Comparison Problem

"a" === new String("a") // false ❌
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Because:

primitive vs object
πŸ”¬ Deep Internal Behavior
When you access a method:

"hello".length
Enter fullscreen mode Exit fullscreen mode

Engine does:

1. Wrap primitive β†’ String object
2. Access property
3. Return value
4. Destroy wrapper
Enter fullscreen mode Exit fullscreen mode

🧠 Why Boxing Exists

To allow:

"hello".toUpperCase()
(10).toFixed(2)
true.toString()
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Without making primitives heavy objects

⚑ 6. Unboxing (Reverse Process)

When needed, object converts back to primitive:


let x = new Number(10);
x + 5 // 15
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Uses:

valueOf()
toString()
🧩 Example

let obj = new Number(10);
obj.valueOf(); // 10
Enter fullscreen mode Exit fullscreen mode

⚠️ 7. Why You Should NOT Use Wrapper Objects
❌ Bad Practice

let str = new String("hello");
Enter fullscreen mode Exit fullscreen mode

Problems:

  1. Unexpected behavior
if (new Boolean(false)) {
  console.log("true"); // runs ❌
}
Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Objects are always truthy

  1. Performance overhead Object creation Memory usage
  2. Confusing comparisons

🧠 8. Primitives vs Objects Summary


πŸ”₯ Real Example (Step-by-step)

"abc".includes("a");
Enter fullscreen mode Exit fullscreen mode

Internally:

1. "abc" β†’ new String("abc")
2. call includes()
3. return true
4. destroy wrapper
Enter fullscreen mode Exit fullscreen mode

🧭 Mental Model


β€œJS temporarily puts primitives inside objects when needed”
Enter fullscreen mode Exit fullscreen mode

🎯 Final Takeaways
Natives = built-in types (primitive + object)
Boxing = wrapping primitive into object temporarily
Happens automatically (autoboxing)
Wrapper objects (new String) should be avoided

Top comments (0)