--- sidebar_position: 1 --- # Объекты Объекты – это ассоциативные массивы с рядом дополнительных возможностей. Они хранят свойства (пары ключ-значение), где: - Ключи свойств должны быть строками или символами (обычно строками). - Значения могут быть любого типа. Чтобы получить доступ к свойству, мы можем использовать: - Запись через точку: obj.property. - Квадратные скобки obj["property"]. Квадратные скобки позволяют взять ключ из переменной, например, obj[varWithKey]. Дополнительные операторы: - Удаление свойства: delete obj.prop. - Проверка существования свойства: "key" in obj. - Перебор свойств объекта: цикл for for (let key in obj). ```js let user = new Object(); // синтаксис "конструктор объекта" let user = {}; // синтаксис "литерал объекта" ``` При использовании литерального синтаксиса \{...\} мы сразу можем поместить в объект несколько свойств в виде пар «ключ: значение»\ Имя свойства может состоять из нескольких слов, но тогда оно должно быть заключено в кавычки: ```js let user = { // объект name: "John", // под ключом "name" хранится значение "John" age: 30, // под ключом "age" хранится значение 30 "likes birds": true // имя свойства из нескольких слов должно быть в кавычках }; // получаем свойства объекта: alert( user.name ); // John ``` Для удаления свойства мы можем использовать оператор delete: ```js delete user.age; ``` 💥 ***Объект, объявленный как константа, может быть изменён*** ### Квадратные скобки Для свойств, имена которых состоят из нескольких слов, доступ к значению «через точку» не работает ```js let user = {}; // присваивание значения свойству user["likes birds"] = true; // получение значения свойства alert(user["likes birds"]); // true let key = "likes birds"; // то же самое, что и user["likes birds"] = true; user[key] = true; // удаление свойства delete user["likes birds"]; ``` Здесь переменная key может быть вычислена во время выполнения кода или зависеть от пользовательского ввода. После этого мы используем её для доступа к свойству. ### Ограничения на имена свойств Как мы уже знаем, имя переменной не может совпадать с зарезервированными словами, такими как «for», «let», «return» и т.д. Но для свойств объекта такого ограничения нет Иными словами, нет никаких ограничений к именам свойств. Они могут быть в виде строк или символов (специальный тип для идентификаторов, который будет рассмотрен позже). Все другие типы данных будут автоматически преобразованы к строке. Например, если использовать число 0 в качестве ключа, то оно превратится в строку "0" Есть небольшой подводный камень, связанный со специальным свойством __proto__. Мы не можем установить его в необъектное значение: ```js let obj = {}; obj.__proto__ = 5; // присвоим число alert(obj.__proto__); // [object Object], значение - это объект, т.е. не то, что мы ожидали ``` ### Проверка существования свойства, оператор «in» В отличие от многих других языков, особенность JavaScript-объектов в том, что можно получить доступ к любому свойству. Даже если свойства не существует – ошибки не будет! При обращении к свойству, которого нет, возвращается **undefined**. Это позволяет просто проверить существование свойства: ```js let user = {}; alert( user.noSuchProperty === undefined ); // true означает "свойства нет" ``` ### "key" in object ```js let user = { name: "John", age: 30 }; alert( "age" in user ); // true, user.age существует alert( "blabla" in user ); // false, user.blabla не существует ``` ### Цикл "for..in" ```js let user = { name: "John", age: 30, isAdmin: true }; for (let key in user) { // ключи alert( key ); // name, age, isAdmin // значения ключей alert( user[key] ); // John, 30, true } ``` ### Упорядочение свойств объекта Cвойства упорядочены особым образом: свойства с целочисленными ключами сортируются по возрастанию, остальные располагаются в порядке создания.