Как мы знаем из главы Типы данных, в JavaScript существует 8 типов данных. Семь из них называются «примитивными», так как содержат только одно значение (будь то строка, число или что-то другое).
Объекты же используются для хранения коллекций различных значений и более сложных сущностей. В JavaScript объекты используются очень часто, это одна из основ языка. Поэтому мы должны понять их, прежде чем углубляться куда-либо ещё.
Объект может быть создан с помощью фигурных скобок {…}
с необязательным списком свойств. Свойство – это пара «ключ: значение», где ключ
– это строка (также называемая «именем свойства»), а значение
может быть чем угодно.
Мы можем представить объект в виде ящика с подписанными папками. Каждый элемент данных хранится в своей папке, на которой написан ключ. По ключу папку легко найти, удалить или добавить в неё что-либо.
Пустой объект («пустой ящик») можно создать, используя один из двух вариантов синтаксиса:
let user = new Object(); // синтаксис "конструктор объекта"
let user = {}; // синтаксис "литерал объекта"
Обычно используют вариант с фигурными скобками {...}
. Такое объявление называют литералом объекта или литеральной нотацией.
Литералы и свойства
При использовании литерального синтаксиса {...}
мы сразу можем поместить в объект несколько свойств в виде пар «ключ: значение»:
let user = { // объект
name: "John", // под ключом "name" хранится значение "John"
age: 30 // под ключом "age" хранится значение 30
};
У каждого свойства есть ключ (также называемый «имя» или «идентификатор»). После имени свойства следует двоеточие ":"
, и затем указывается значение свойства. Если в объекте несколько свойств, то они перечисляются через запятую.
В объекте user
сейчас находятся два свойства:
- Первое свойство с именем
"name"
и значением"John"
. - Второе свойство с именем
"age"
и значением30
.
Можно сказать, что наш объект user
– это ящик с двумя папками, подписанными «name» и «age».
Мы можем в любой момент добавить в него новые папки, удалить папки или прочитать содержимое любой папки.
Для обращения к свойствам используется запись «через точку»:
// получаем свойства объекта:
alert( user.name ); // John
alert( user.age ); // 30
Значение может быть любого типа. Давайте добавим свойство с логическим значением:
user.isAdmin = true;
Для удаления свойства мы можем использовать оператор delete
:
delete user.age;
Имя свойства может состоять из нескольких слов, но тогда оно должно быть заключено в кавычки:
let user = {
name: "John",
age: 30,
"likes birds": true // имя свойства из нескольких слов должно быть в кавычках
};
Последнее свойство объекта может заканчиваться запятой:
let user = {
name: "John",
age: 30,
}
Это называется «висячая запятая». Такой подход упрощает добавление, удаление и перемещение свойств, так как все строки объекта становятся одинаковыми.
Объект, объявленный как константа, может быть изменён
Объект, объявленный через const
, может быть изменён.
Например:
const user = {
name: "John"
};
user.name = "Pete"; // (*)
alert(user.name); // Pete
Может показаться, что строка (*)
должна вызвать ошибку, но нет, здесь всё в порядке. Дело в том, что объявление const
защищает от изменений только саму переменную user
, а не её содержимое.
Определение const
выдаст ошибку только если мы присвоим переменной другое значение: user=...
.
Есть ещё один способ сделать константами свойства объекта, который мы рассмотрим в главе Флаги и дескрипторы свойств.