Files
frontend-docs/docs/javascript/objects/01-intro.md
2025-02-28 10:31:23 +03:00

121 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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
}
```
### Упорядочение свойств объекта
ойства упорядочены особым образом: свойства с целочисленными ключами сортируются по возрастанию, остальные располагаются в порядке создания.