Краткий обзор типов данных и структур
Вы слышали, что «все в 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.
Как вы думаете, какая фраза была бы лучше? Дайте мне знать, если это помогло!
Удачного кодирования 🤓