Краткий обзор типов данных и структур

Вы слышали, что «все в Javascript является объектом»? Когда я впервые начал изучать Javascript, кто-то сказал мне, что все в JS является объектом, и это меня зацепило. Услышав это, я почувствовал легкость и уверенность в том, что склоняюсь к этой идее, но я думал, что это не совсем так. На самом деле, я бы сказал, что это заблуждение.

Он вернулся ко мне, когда я наткнулся на выражение typeof({});. Как и следовало ожидать, если вы знаете что-нибудь о JS, «Объект» был возвращен в консоль. И по какой-то причине это заставило меня задуматься о том, что «Все в JS является объектом», но если все является объектом, то почему typeof(2) возвращает число, а не возвращает «объект»?

Итак, как же нам отличить, что является «объектом», а что нет, когда мы имеем дело с объектно-ориентированным программированием?

Легкий ответ? ‘Объекты относятся к структуре данных, содержащей данные и инструкции по работе с данными’.

Объекты — это структуры данных, которые содержат данные. Они могут быть простой парой ключ/значение или сложной системой вложенных пар ключ-значение, представляющих пользователя и все его сообщения, такие как друзья, комментарии, личные данные и т. д. Они могут хранить несколько значений в качестве свойств.

Сначала поговорим о примитивных типах данных, присутствующих в JS:

Не определено (undefined), используется для непреднамеренно отсутствующих значений.

Null (null), используется для намеренно отсутствующих значений.

Логические значения (true и false), используемые для логических операций.

Числа (-100, 3.14 и другие), используемые для математических расчетов.

Строки ("hello", "abracadabra" и другие), используемые для текста.

Символы (необычные), используемые для сокрытия сведений о реализации.

BigInts (необычные и новые), используемые для математических вычислений с большими числами.

Краткое примечание: технически null возвращает объект при использовании с оператором typeof(). Что ж, сегодня я узнал, что null — это только примитивный тип, но из-за какой-то изначальной ошибки в версии JavaScript он отображается как объект.

Мне нравится думать о примитивных типах данных так, что они считаются быстрыми и легкими. Объекты увязают, удерживая так много разных примитивных типов, и становятся довольно тяжелыми. Однако Брендан Эйх (создатель JavaScript) знал, что пользователи JavaScript захотят получить доступ к этим примитивным типам разными способами. Представляем примитивные объекты-обертки.

Разработка примитивных объектов-оболочек в JS — это то, что предоставляет нам различные методы для некоторых наших примитивных типов данных. Я нашел отличный ресурс, который объясняет это НАМНОГО лучше, чем я смог бы:

Решение выглядит немного неуклюжим, но вот оно:

1. Примитивы остаются примитивными. Одно значение, по желанию.
2. Язык позволяет получить доступ к методам и свойствам Strings, Numbers, Booleans и Symbols.
3. Для того, чтобы это работало, специальная «оболочка объекта», которая обеспечивает дополнительную функциональность, создается, а затем уничтожается.

Оболочки объектов различаются для каждого типа примитивов и называются: String, Number, Boolean и Symbol. Таким образом, они предоставляют разные наборы методов.

Например, существует строковый методstr.toUpperCase(), возвращающий str с заглавной буквы.

Вот как это работает:

let str = "Hello";
alert( str.toUpperCase() ); // HELLO

Просто, правда? Вот что на самом деле происходит в str.toUpperCase():

1. Строка str является примитивом. Таким образом, в момент доступа к его свойству создается специальный объект, который знает значение строки и имеет полезные методы, такие как toUpperCase().
2. Этот метод запускается и возвращает новую строку (показанную alert).
3. Специальный объект уничтожается, остается только примитив str.

Поэтому примитивы могут предоставлять методы, но при этом остаются легковесными.

И это, друзья мои, одна из причин, по которой вы здесь используете фразу «все в JavaScript является объектом». Технически это ложное утверждение. Все НЕ ЯВЛЯЕТСЯ объектами в JavaScript. Может быть, фраза должна звучать так: «Все в JavaScript может вести себя как объект»? Кто скажет? Все, что я знаю, это то, что исходная фраза может вводить в заблуждение, но она определенно помогла мне в моих начинаниях с JS.

Как вы думаете, какая фраза была бы лучше? Дайте мне знать, если это помогло!

Удачного кодирования 🤓