Hack Frontend Community

Boxing и Unboxing в JavaScript

Boxing и Unboxing — это процессы автоматического преобразования примитивных типов данных в объектные обёртки, и обратно. Эти процессы происходят неявно в JavaScript, когда вы работаете с методами и свойствами примитивов.


Что такое Boxing?

Boxing — это оборачивание примитива в объект, чтобы можно было использовать методы и свойства объекта.

Например, строка str = "hello" — это примитив. Но вы всё равно можете вызвать метод str.toUpperCase():

const str = "hello";
console.log(str.toUpperCase()); // "HELLO"

Как это работает?

Под капотом происходит следующее:

const str = "hello";
const temp = new String(str);   // Boxing: примитив → объект String
console.log(temp.toUpperCase()); // вызывается метод объекта
// temp удаляется, возвращается результат

То же работает и для Number, Boolean, Symbol и других примитивов:

const num = 42;
console.log(num.toFixed(2)); // "42.00" — примитив превращается в объект Number

Что такое Unboxing?

Unboxing — это обратный процесс: извлечение примитивного значения из объектной обёртки.

Пример:

const numObj = new Number(123); // объект
const primitive = numObj.valueOf(); // Unboxing
console.log(typeof primitive); // "number"

Метод valueOf() используется движком JavaScript, чтобы получить чистое примитивное значение из объекта-обёртки.

Типы объектных обёрток

ПримитивОбъектная обёртка
stringString
numberNumber
booleanBoolean
symbolSymbol
bigintBigInt

Пример автоматическое Boxing и Unboxing

const str = "hello";

// Boxing
str.length; // → создается временный объект String
str.toUpperCase(); // → "HELLO"

// Unboxing
const obj = new Boolean(false);
if (obj) {
  console.log("Это истина!"); // будет выведено, потому что obj — объект, а не примитив false
}

Осторожно с объектами-обёртками:

Использование new Boolean(false), new Number(0) и т. д. может привести к неожиданному поведению, потому что объекты всегда truthy, даже если внутри значение — falsy.

Итог

Boxing — это автоматическое преобразование примитива во временный объект, чтобы можно было использовать методы (например, toUpperCase).

Unboxing — извлечение примитива из объектной обёртки (например, через valueOf()).

Эти процессы происходят неявно, поэтому важно понимать, что вы работаете либо с примитивом, либо с объектом.

Факт:

В обычной практике вам редко нужно вручную использовать boxing/unboxing — JavaScript делает это за вас. Но понимание этих процессов важно для глубокого понимания языка.