add typescript
This commit is contained in:
120
docs/javascript/02-objects/01-intro.md
Normal file
120
docs/javascript/02-objects/01-intro.md
Normal file
@@ -0,0 +1,120 @@
|
||||
---
|
||||
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войства упорядочены особым образом: свойства с целочисленными ключами сортируются по возрастанию, остальные располагаются в порядке создания.
|
||||
Reference in New Issue
Block a user