Объекты используются для хранения коллекций различных данных и более сложных сущностей с ключами. Объект можно создать с фигурными скобками {…}
с необязательным списком свойств. Свойство — это пара «ключ: значение», где key
— это строка (также называемая «именем свойства»), а value
может быть чем угодно.
Ниже приведен пример того, как выглядит объект.
переменная пользователь = {
имя: «Джон»,
возраст: 30
};
Здесь «имя» и «возраст» называются ключами объекта пользователь, а «Джон» и 30 называются значениями объекта. пользователь.
Мы можем добавлять, удалять и читать файлы из него в любое время.
Значения свойств доступны с использованием записи через точку:
// get property values of the object:
alert( user.name ); // John
alert( user.age ); // 30
Чтобы удалить свойство, мы можем использовать оператор delete
:
delete user.age;
Объект.создать():
Давайте посмотрим, как работает Object.create() на примере.
Пример:
const person = {
isHuman: false,
printIntroduction: function() {
console.log(`Меня зовут ${this.name}. Я человек? ${this.isHuman }`);
}
};
const me = Object.create(человек);
me.name = 'Мэттью'; // «имя» — это свойство, установленное для «меня», но не для «человека»
me.isHuman = true; // унаследованные свойства могут быть перезаписаны
me.printIntroduction();
// ожидаемый результат: «Меня зовут Мэтью. Я человек? истинный"
Расчетные свойства
Мы можем использовать квадратные скобки в литерале объекта при создании объекта. Это называется вычисляемые свойства.
Например:
let fruit = prompt("Which fruit to buy?", "apple");
let bag = { [fruit]: 5, // the name of the property is taken from the variable fruit };
alert( bag.apple ); // 5 if fruit="apple"
Ограничения имен свойств
Как мы уже знаем, переменная не может иметь имя, равное одному из зарезервированных для языка слов, таких как «for», «let», «return» и т. д.
Но для свойства объекта такого ограничения нет:
// these properties are all right let obj = { for: 1, let: 2, return: 3 };
alert( obj.for + obj.let + obj.return ); // 6
Есть небольшая ошибка со специальным свойством с именем __proto__
. Мы не можем установить его в значение, не являющееся объектом:
let obj = {};
obj.__proto__ = 5; // assign a number
alert(obj.__proto__); // [object Object] - the value is an object, didn't work as intended
Как видно из кода, присваивание примитиву 5
игнорируется.
Проверка существования свойства, оператор «в»
Примечательной особенностью объектов в JavaScript по сравнению со многими другими языками является возможность доступа к любому свойству. Не будет ошибки, если свойство не существует!
Чтение несуществующего свойства просто возвращает undefined
. Таким образом, мы можем легко проверить, существует ли свойство:
let user = {};
alert( user.noSuchProperty === undefined ); // true means "no such property"
Для этого также есть специальный оператор "in"
.
Синтаксис:
"key" in object
Например:
let user = { name: "John", age: 30 };
alert( "age" in user ); // true, user.age exists alert( "blabla" in user ); // false, user.blabla doesn't exist
Цикл for…in
Для обхода всех ключей объекта существует специальная форма цикла: for..in
. Это полностью отличается от конструкции for(;;)
, которую мы изучали ранее.
Синтаксис:
for (key in object) {
// executes the body for each key among object properties
}
Например, выведем все свойства user
:
let user = { name: "John", age: 30, isAdmin: true };
for (let key in user) { // keys alert( key ); // name, age, isAdmin // values for the keys alert( user[key] ); // John, 30, true }
Обратите внимание, что все конструкции for позволяют нам объявить переменную цикла внутри цикла, например let key
здесь.
"Резюме"
Объекты представляют собой ассоциативные массивы с некоторыми особенностями.
В них хранятся свойства (пары ключ-значение), где:
- Ключи свойств должны быть строками или символами (обычно строками).
- Значения могут быть любого типа.
Чтобы получить доступ к свойству, мы можем использовать:
- Точечное обозначение:
obj.property
. - Обозначение в квадратных скобках
obj["property"]
. Квадратные скобки позволяют взять ключ из переменной, напримерobj[varWithKey]
.
Дополнительные операторы:
- Чтобы удалить свойство:
delete obj.prop
. - Чтобы проверить, существует ли свойство с данным ключом:
"key" in obj
. - Чтобы перебрать объект:
for (let key in obj)
цикл.