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, чтобы получить чистое примитивное значение из объекта-обёртки.
Типы объектных обёрток
| Примитив | Объектная обёртка |
|---|---|
string | String |
number | Number |
boolean | Boolean |
symbol | Symbol |
bigint | BigInt |
Пример автоматическое 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 делает это за вас. Но понимание этих процессов важно для глубокого понимания языка.