@anvaslist

Почему одни экземпляры создаём через new, а другие литерально?

Всем добрый день.

Подскажите пожалуйста, почему экземпляры встроенных объектов, например, Number, String, Boolean, Object, Function мы создаем литерально, то есть объявляем переменную и присваиваем ей значение. А некоторые экземпляры объектов, которые тоже являются встроенными, мы создаём уже с помощью оператора new, например Promise или Date? Ведь те значения, строки, числа, булевые значения, объекты объявленные литерально, функции (которые мы объявляем как function declaration, не присваивая какой-либо переменной) - они ведь тоже являются экземплярами встроенных объектов, как и:
const promise = new Promise(/*some function as parameter*/);
const date = new Date();

Только promise и date мы почему-то создаем через оператор new, а те же числа, строки, объекты, булевые значения, function declaration/expression без оператора new. Объясните пожалуйста, почему именно так? Если любые значения являются по сути экземплярами определенных встроенных объектов.

Если я сделаю вот так:
console.log(new Number(1) + new Number(2)); // выводится 3 и typeof полученного значения number
То есть всё в порядке, это то же самое, как если бы мы сделали:
console.log(1 + 2);

И ничего не изменилось бы, но всё же не пойму, что почему некоторые экземпляры мы создаем исключительно через оператор new ? А не литерально.
Важное замечание: Я сейчас не привязываюсь конкретно к встроенным объектам Promise и Date, экземпляры которых создаются через new, я их привёл исключительно в качестве примера, есть и куча других встроенных объектов, экземпляры которых мы создаем с помощью new. Поэтому не привязывайтесь пожалуйста в данном вопросе конкретно к Promise и Date!
  • Вопрос задан
  • 465 просмотров
Решения вопроса 1
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
console.log(new Number(1) + new Number(2)); // выводится 3 и typeof полученного значения number
То есть всё в порядке, это то же самое, как если бы мы сделали:
console.log(1 + 2);

Число - это Primitive. У примитивов есть эквивалентные объектные аналоги (кроме null и undefined). Поэтому да, это "то же самое" в каком-то смысле (у примитива нет методов, в отличии от эквивалентного объекта, они не могут быть изменены, и.т.д., но в таких простых расчетах мы не обращаем на это внимания). А штуки вроде упомянутых промисов, дат и что там еще бывает - это будут уже не примитивные типы данных, там такой двойственности уже нет.

В остальном - там есть немного синтаксического сахара, связанного с функциями и объектами. Например Object может быть создан разными способами, хотя фактически они приводят к одному результату, а не как у примитивов и их объектных оберток-аналогов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега JavaScript
Number(123) === 123 // true
new Number(123) === 123 // false
Number(123) === new Number(123) // false


Изучай в консоли результаты выполнения. Есть примитивы, есть конструкторы примитивов. Это разные вещи.

Почему? А вот так. Запомнить, принять.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы