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 делает это за вас. Но понимание этих процессов важно для глубокого понимания языка.