Коротка відповідь
juniornew String створює об’єкт-обгортку, а не простий рядок; це призводить до непередбачуваних порівнянь і збільшує пам’ять. Використання літералів або String() гарантує примітивний тип і кращу продуктивність.
Повне пояснення
Що це і навіщо
new String() створює об’єкт‑обгортку типу String, який містить внутрішній примітивний рядок. Це не той самий тип, що й простий рядок (string), і його поведінка відрізняється.
Ключові принципи/терміни
- Примітивний тип –
string, без обгортки. - Об’єкт‑обгортка –
String, створюється через конструктор. - Порівняння –
new String('a') === 'a'повертаєfalse, бо порівнюються об’єкт і примітив.
Як це працює
При виклику new String('text') створюється новий об’єкт, що містить поле [[PrimitiveValue]]. При доступі до властивостей об’єкта виконується авто‑обгортка, але сам об’єкт залишається окремим.
Практика і реалізація
const a = new String('hello');
const b = 'hello';
console.log(a == b); // true – авто‑обгортка
console.log(a === b); // false – різні типи
Тестування
import { expect } from 'vitest';
expect(new String('x')).toBeInstanceOf(String);
expect(typeof new String('x')).toBe('object');
Безпека і приватність
Об’єкти‑обгортки можуть бути змінені, що створює ризик непередбачуваних побічних ефектів.
Оптимізація
Використання літералів ('text') або функції String() забезпечує примітивний тип, зменшує використання пам’яті і уникне проблем із порівняннями.
Часті помилки
- Порівняння об’єкта з примітивом –
new String('a') === 'a'→false. - Використання в масивах – об’єкт‑обгортка не інтерпретується як рядок.
- Підрахунок довжини –
new String('abc').lengthпрацює, але об’єкт займе більше пам’яті. - Методи –
new String('a').toUpperCase()працює, але повертає об’єкт. - JSON.stringify – об’єкт‑обгортка не серіалізується як рядок.
- Підключення до DOM –
new String('div')не створює елемент. - Підтримка типів – TypeScript розпізнає
Stringяк об’єкт, а не примітив. - Пам’ять – кожен виклик створює новий об’єкт, що збільшує GC‑нагрузку.
Cheatsheet
- Не:
new String('text') - Так:
'text'абоString('text')
Follow‑up питання
- Які ще обгорткові типи існують у JavaScript?
- Як
Object.isповодиться з об’єкт‑обгортками?