add typescript
This commit is contained in:
76
docs/javascript/02-objects/02-copying-objects.md
Normal file
76
docs/javascript/02-objects/02-copying-objects.md
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Копирование объектов и ссылки
|
||||
|
||||
💥 ***При копировании переменной объекта копируется ссылка, но сам объект не дублируется.***
|
||||
```js
|
||||
let user = { name: 'John' };
|
||||
|
||||
let admin = user;
|
||||
|
||||
admin.name = 'Pete'; // изменено по ссылке из переменной "admin"
|
||||
|
||||
alert(user.name); // 'Pete', изменения видны по ссылке из переменной "user"
|
||||
```
|
||||
|
||||
## Сравнение по ссылке
|
||||
Два объекта равны только в том случае, если это один и тот же объект.
|
||||
|
||||
***a*** и ***b*** ссылаются на один и тот же объект, поэтому они равны:
|
||||
```js
|
||||
let a = {};
|
||||
let b = a; // копирование по ссылке
|
||||
|
||||
alert( a == b ); // true, обе переменные ссылаются на один и тот же объект
|
||||
alert( a === b ); // true
|
||||
```
|
||||
|
||||
Здесь два независимых объекта не равны, даже если они выглядят одинаково (оба пусты):
|
||||
```js
|
||||
let a = {};
|
||||
let b = {}; // два независимых объекта
|
||||
|
||||
alert( a == b ); // false
|
||||
```
|
||||
|
||||
## Клонирование и объединение, Object.assign
|
||||
Есть 2 вида копирования shallow - поверхностное и deep - глубокое
|
||||
|
||||
#### Перебор всех свойств объекта через цикл или рекурсию (shallow / deep)
|
||||
```js
|
||||
let user = {
|
||||
name: "John",
|
||||
age: 30
|
||||
};
|
||||
|
||||
let clone = {}; // новый пустой объект
|
||||
|
||||
// давайте скопируем все свойства user в него
|
||||
for (let key in user) {
|
||||
clone[key] = user[key];
|
||||
}
|
||||
|
||||
// теперь clone это полностью независимый объект с тем же содержимым
|
||||
clone.name = "Pete"; // изменим в нём данные
|
||||
|
||||
alert( user.name ); // все ещё John в первоначальном объекте
|
||||
```
|
||||
Готовая реализация, через например _.cloneDeep(obj) из библиотеки JavaScript lodash.
|
||||
|
||||
#### Метод Object.assign (shallow)
|
||||
```js
|
||||
Object.assign(dest, [src1, src2, src3...])
|
||||
```
|
||||
#### Оператор расширения \{...obj\} (shallow)
|
||||
Метод тоже делает поверхностное копирование, для глубокого надо обойти объект рекурсивно
|
||||
|
||||
#### JsonParse (deep)
|
||||
Cамый простой способ скопировать объект со всеми уровнями вложенности, не копирует методы:
|
||||
```js
|
||||
let clone = JSON.parse(JSON.stringify(obj))
|
||||
```
|
||||
|
||||
#### Метод structuredClone (deep)
|
||||
Мы можем использовать глобальный метод ***structuredClone()***, который позволяет сделать полную копию объекта. К сожалению он поддерживается только современными браузерами.
|
||||
Reference in New Issue
Block a user