Skip to main content

Объекты

Объекты – это ассоциативные массивы с рядом дополнительных возможностей.

Они хранят свойства (пары ключ-значение), где:

  • Ключи свойств должны быть строками или символами (обычно строками).
  • Значения могут быть любого типа.

Чтобы получить доступ к свойству, мы можем использовать:

  • Запись через точку: obj.property.
  • Квадратные скобки obj["property"]. Квадратные скобки позволяют взять ключ из переменной, например, obj[varWithKey].

Дополнительные операторы:

  • Удаление свойства: delete obj.prop.
  • Проверка существования свойства: "key" in obj.
  • Перебор свойств объекта: цикл for for (let key in obj).
let user = new Object(); // синтаксис "конструктор объекта"
let user = {}; // синтаксис "литерал объекта"

При использовании литерального синтаксиса {...} мы сразу можем поместить в объект несколько свойств в виде пар «ключ: значение»
Имя свойства может состоять из нескольких слов, но тогда оно должно быть заключено в кавычки:

let user = {     // объект
name: "John", // под ключом "name" хранится значение "John"
age: 30, // под ключом "age" хранится значение 30
"likes birds": true // имя свойства из нескольких слов должно быть в кавычках
};
// получаем свойства объекта:
alert( user.name ); // John

Для удаления свойства мы можем использовать оператор delete:

delete user.age;

💥 Объект, объявленный как константа, может быть изменён

Квадратные скобки

Для свойств, имена которых состоят из нескольких слов, доступ к значению «через точку» не работает

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. Мы не можем установить его в необъектное значение:

let obj = {};
obj.__proto__ = 5; // присвоим число
alert(obj.__proto__); // [object Object], значение - это объект, т.е. не то, что мы ожидали

Проверка существования свойства, оператор «in»

В отличие от многих других языков, особенность JavaScript-объектов в том, что можно получить доступ к любому свойству. Даже если свойства не существует – ошибки не будет!

При обращении к свойству, которого нет, возвращается undefined. Это позволяет просто проверить существование свойства:

let user = {};

alert( user.noSuchProperty === undefined ); // true означает "свойства нет"

"key" in object

let user = { name: "John", age: 30 };

alert( "age" in user ); // true, user.age существует
alert( "blabla" in user ); // false, user.blabla не существует

Цикл "for..in"

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войства упорядочены особым образом: свойства с целочисленными ключами сортируются по возрастанию, остальные располагаются в порядке создания.

🚀 Источник: https://learn.javascript.ru/object