Кратко
Когда вы вызываете метод примитива ('hello'.length), JavaScript временно создаёт объект-обёрку (new String('hello')). После вызова метода обёртка удаляется. Примитив ≠ объект: typeof 'hello' = 'string', typeof new String('hello') = 'object'. new String() не рекомендуется.
Подробно
Boxing behavior: const str = 'hello'; console.log(str.toUpperCase()); // 'HELLO'
Что происходит:
- str — примитив 'string'
- JavaScript создаёт: new String(str)
- Вызывает: .toUpperCase() на объекте
- Объект удаляется
- Возвращается примитив 'HELLO'
Примитив vs Wrapper: const prim = 'hello'; const obj = new String('hello');
console.log(typeof prim); // 'string' console.log(typeof obj); // 'object' console.log(prim === obj); // false
new String() — проблемы: const s1 = new String('hello'); const s2 = new String('hello'); console.log(s1 == s2); // true (приведение к примитиву) console.log(s1 === s2); // false (разные объекты!)
То же для Number и Boolean: const n = new Number(5); const b = new Boolean(true); console.log(typeof n); // 'object' console.log(typeof b); // 'object'
Почему new String() не нужен:
- Примитивы уже имеют методы (boxing)
- new String() создаёт object, не string
- Сравнения работают некорректно
- Линтеры запрещают new String/Number/Boolean
Ментальная модель
Обёртка — как временный костюм. Примитив 'hello' — обычный человек. Когда он хочет вызвать метод (.toUpperCase()) — он надевает костюм объекта (new String()). Метод работает. Костюм снимается. Человек снова примитив.
Примеры
**Самый простой:**
const str = 'hello';
console.log(str.length); // 5 (boxing)
console.log(str.toUpperCase()); // 'HELLO'
// Автоматически:
// 1. Создаётся new String('hello')
// 2. Вызывается метод
// 3. Объект удаляетсяBoxing: примитив временно становится объектом для вызова метода.
**Простой:**
const prim = 'hello';
const obj = new String('hello');
console.log(typeof prim); // 'string'
console.log(typeof obj); // 'object'
console.log(prim === obj); // false
console.log(prim == obj); // true (приведение)
// Поэтому new String() — плохая идея
// Примитив уже имеет все методыПримитив ≠ объект-обёртка.
**Реальный пример:**
// Автоматический boxing в действии
function getLength(value) {
// Если value — примитив,boxing создаёт объект
// Если value — null/undefined — ошибка
return value.length;
}
console.log(getLength('hello')); // 5
console.log(getLength([1, 2, 3])); // 3
// console.log(getLength(null)); // TypeError
// console.log(getLength(undefined)); // TypeErrorBoxing работает для всех примитивов: string, number, boolean.
Частые ошибки
**Неправильно:** Использовать new String() / new Number()
**Почему:** Создаёт объект, а не примитив. Сравнения и typeof работают некорректно.
**Правильно:** Используйте примитивы: 'hello', 5, true. Методы работают через boxing.
**Неправильно:** Путать typeof для wrapper объектов
**Почему:** typeof new String('hello') = 'object', а не 'string'.
**Правильно:** typeof wrapper = 'object'. typeof primitive = 'string'/'number'/'boolean'.
Важно запомнить
- Boxing: примитив временно становится объектом
- typeof wrapper = 'object', typeof primitive = 'string'/'number'/'boolean'
- new String/Number/Boolean не рекомендуется
- Примитивы уже имеют методы через boxing
- null и undefined НЕ имеют методов
Связь
Назад: Вы знаете типы (J3). Обёртки примитивов объясняют, как примитивы получают методы.
Вперёд: Следующий урок (JV24) — сборка мусора — как JavaScript управляет памятью.