JS Advanced

Обёртки примитивов

Понять, как JavaScript временно создаёт объекты-обёртки (String, Number, Boolean) для вызова методов примитивов.

Продвинутый (Advanced)

Кратко

Когда вы вызываете метод примитива ('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()). Метод работает. Костюм снимается. Человек снова примитив.


Примеры

**Самый простой:**

javascript
const str = 'hello';
console.log(str.length);      // 5 (boxing)
console.log(str.toUpperCase()); // 'HELLO'

// Автоматически:
// 1. Создаётся new String('hello')
// 2. Вызывается метод
// 3. Объект удаляется

Boxing: примитив временно становится объектом для вызова метода.

**Простой:**

javascript
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() — плохая идея
// Примитив уже имеет все методы

Примитив ≠ объект-обёртка.

**Реальный пример:**

javascript
// Автоматический 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)); // TypeError

Boxing работает для всех примитивов: 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 управляет памятью.

Материалы курса JS Advanced — PROlab Academy.