Все ли объекты в JavaScript?

У меня было неправильное представление о том, что в JS все является объектом. Я не совсем уверен, как я пришел к этому. Возможно, дело было в том, что вы могли вызывать методы для таких примитивов, как str.toUpperCase() или int.toFixed(). За последние несколько месяцев я читал о основы JS и пришли к выводу, что это НЕ дело. Эта функциональность JS была для меня новой, и я был удивлен, что о ней не часто говорят.

const str = 'This is a string';
str.toUpperCase(); // THIS IS A STRING
typeof str; // string

Если str действительно является примитивом, почему для него доступен метод toUpperCase. Ну, JS творит чудеса в фоновом режиме. Вот что происходит на заднем плане:

  • Когда вы вызываете метод для примитива (в данном примере это строка), JS создает в фоновом режиме временный специальный объект, который имеет методы, специфичные для примитива. Тип объекта зависит от типа примитива. Итак, если это число, у нас есть доступ к методам, связанным с числом.
  • Вызывается метод, который возвращает результат в виде нового примитива (в данном примере — строки).
  • Временный объект уничтожается

Можно подумать, что это дополнительные ненужные накладные расходы, но движки JS сильно оптимизируют этот процесс, и преимущества намного перевешивают затраты.

Все примитивные типы данных, кроме null и undefined, имеют свои методы, специфичные для них.

Зачем нужен этот обходной путь?

Это просто делает очень удобным иметь методы, напрямую доступные через примитивы. Код также выглядит намного чище.

Альтернатива? Не рекомендуется.

Есть и другой способ сделать то же самое, что и в приведенном выше примере, но он не рекомендуется.

const str = new String('This is a string');
str.toUpperCase(); // THIS IS A STRING
typeof str; // object

Как вы можете видеть, когда вы создаете экземпляр String, результирующий экземпляр имеет все доступные методы, связанные со строками, как и строковый примитив, но на самом деле это объект. Вызов typeof показывает это. Этот экземпляр будет нести тяжесть объекта, куда бы он ни пошел. Это может запутать других разработчиков и вызвать проблемы при использовании typeof. Следовательно, настоятельно рекомендуется работать с примитивами.

Сводка

Создание/удаление временных объектов стало для меня открытием. Я предположил, что JS должен внутренне управлять этими примитивами как объектами. Эти причуды JS всегда держат меня в напряжении и заставляют меня понять, что даже после того, как я программировал на JS почти десять лет, мне предстоит пройти долгий путь! Надеюсь, это было полезно!