ÐднÑÑÑ Ð· пÑинÑÐ¸Ð¿Ð¾Ð²Ð¸Ñ Ð²ÑдмÑнноÑÑей обâÑкÑÑв вÑд пÑимÑÑивÑв Ñ Ñе, Ñо обâÑкÑи збеÑÑгаÑÑÑÑÑ Ñа копÑÑÑÑÑÑÑ âза поÑиланнÑмâ, ÑÐ¾Ð´Ñ Ñк пÑимÑÑÐ¸Ð²Ð½Ñ Ð·Ð½Ð°ÑеннÑ: ÑÑдки, ÑиÑла, логÑÑÐ½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ ÑоÑо â завжди копÑÑÑÑÑÑÑ âза знаÑеннÑмâ.
Це легко зÑозÑмÑÑи, ÑкÑо заглÑнÑÑи пÑд ÐºÐ°Ð¿Ð¾Ñ Ñого, Ñо вÑдбÑваÑÑÑÑÑ, коли ми копÑÑÑмо знаÑеннÑ.
ÐоÑнемо з пÑимÑÑивÑ, напÑиклад, ÑÑдка.
ÐапиÑемо копÑÑ message Ñ phrase:
let message = "ÐÑивÑÑ!";
let phrase = message;
Ð ÑезÑлÑÑаÑÑ Ð¼Ð¸ маÑмо Ð´Ð²Ñ Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ñ Ð·Ð¼ÑннÑ, кожна з ÑкиÑ
збеÑÑÐ³Ð°Ñ ÑÑдок "ÐÑивÑÑ!".
ЦÑлком оÑÑкÑваний ÑезÑлÑÑаÑ, згоднÑ?
ÐбâÑкÑи поводÑÑÑÑÑ ÑнакÑе.
ÐмÑнна збеÑÑÐ³Ð°Ñ Ð½Ðµ Ñам обâÑкÑ, а його âадÑеÑÑ Ð² памâÑÑÑâ â ÑнÑими Ñловами âпоÑиланнÑâ на нÑого.
ÐÑоÑлÑÑÑÑÑÑмо Ñе:
let user = {
name: "Ðван"
};
РоÑÑ Ñк Ñе наÑпÑÐ°Ð²Ð´Ñ Ð·Ð±ÐµÑÑгаÑÑÑÑÑ Ð² памâÑÑÑ:
ÐбâÑÐºÑ Ð·Ð±ÐµÑÑгаÑÑÑÑÑ Ð´ÐµÑÑ Ñ Ð¿Ð°Ð¼âÑÑÑ (ÑпÑава на зобÑаженнÑ), ÑÐ¾Ð´Ñ Ñк Ñ Ð·Ð¼ÑннÑй user (злÑва) Ñ âпоÑиланнÑâ на нÑого.
Ðи можемо дÑмаÑи пÑо змÑÐ½Ð½Ñ user, Ñк пÑо ÑÑÑ
лÑÐ´Ñ Ð· аÑкÑÑем папеÑÑ Ð· адÑеÑÐ¾Ñ Ð¾Ð±âÑкÑа на нÑомÑ.
Ðоли ми виконÑÑмо дÑÑ Ð· обâÑкÑом, напÑ. зÑиÑÑÑмо влаÑÑивÑÑÑÑ user.name, ÑÑÑÑй JavaScript пеÑевÑÑÑÑ, Ñо знаÑ
одиÑÑÑÑ Ð·Ð° ÑÑÑÑ Ð°Ð´ÑеÑоÑ, Ñ Ð²Ð¸ÐºÐ¾Ð½ÑÑ Ð¾Ð¿ÐµÑаÑÑÑ Ð½Ð°Ð´ ÑакÑиÑним обâÑкÑом.
ÐÑÑ ÑÐ¾Ð¼Ñ Ñе важливо:
Ðоли копÑÑÑÑÑÑÑ Ð·Ð¼Ñнна обâÑкÑа, копÑÑÑÑÑÑÑ Ð¿Ð¾ÑиланнÑ, але Ñам обâÑÐºÑ Ð½Ðµ дÑблÑÑÑÑÑÑ.
ÐапÑиклад:
let user = { name: "Ðван" };
let admin = user; // копÑÑÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑиланнÑ
Ð¢ÐµÐ¿ÐµÑ Ñ Ð½Ð°Ñ Ñ Ð´Ð²Ñ Ð·Ð¼ÑннÑ, кожна з ÑÐºÐ¸Ñ Ð·Ð±ÐµÑÑÐ³Ð°Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñой Ñамий обâÑкÑ:
Як баÑиÑе, Ñ ÑÑлÑки один обâÑкÑ, але ÑÐµÐ¿ÐµÑ Ñз двома змÑнними, ÑÐºÑ Ð¿Ð¾ÑилаÑÑÑÑÑ Ð½Ð° нÑого.
Ðи можемо викоÑиÑÑаÑи бÑдÑ-ÑÐºÑ Ð·Ð¼ÑÐ½Ð½Ñ Ð´Ð»Ñ Ð´Ð¾ÑÑÑÐ¿Ñ Ð´Ð¾ обâÑкÑа Ñа модиÑÑкаÑÑÑ Ð¹Ð¾Ð³Ð¾ вмÑÑÑÑ:
let user = { name: 'Ðван' };
let admin = user;
admin.name = 'ÐеÑÑо'; // змÑнено за поÑиланнÑм Ð·Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ "admin"
alert(user.name); // 'ÐеÑÑо', змÑни видно з поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ "user"
УÑвÑÑÑ, Ñо обâÑÐºÑ â Ñе ÑаÑа з ÑкимиÑÑ Ð´Ð°Ð½Ð¸Ð¼Ð¸ (влаÑÑивоÑÑÑми). Ð âадÑеÑаâ ÑÑÑÑ ÑаÑи збеÑÑгаÑÑÑÑÑ Ñ Ð´Ð²Ð¾Ñ
ÑÑÑ
лÑдаÑ
. СпоÑаÑÐºÑ Ð¼Ð¸ викоÑиÑÑовÑÑмо Ð¾Ð´Ð½Ñ Ð· ниÑ
(admin), Ñоб дÑÑÑаÑиÑÑ ÑÑÑÑ ÑаÑи Ñа ÑоÑÑ Ð·Ð¼ÑниÑи. ÐоÑÑм, ÑкÑо ми викоÑиÑÑаÑмо ÑнÑÑ ÑÑÑ
лÑÐ´Ñ (user), ми вÑе Ñе вÑдкÑиваÑмо ÑÑ ÑÐ°Ð¼Ñ ÑаÑÑ Ð¹ оÑÑимÑÑмо доÑÑÑп до змÑненого вмÑÑÑÑ.
ÐоÑÑвнÑÐ½Ð½Ñ Ð·Ð° поÑиланнÑм
Ðва обâÑкÑи ÑÑвнÑ, лиÑе ÑкÑо Ñе Ñой Ñамий обâÑкÑ.
ÐапÑиклад, ÑÑÑ a Ñ b поÑилаÑÑÑÑÑ Ð½Ð° один обâÑкÑ, оÑже, вони ÑÑвнÑ:
let a = {};
let b = a; // копÑÑÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑиланнÑ
alert( a == b ); // true, Ð¾Ð±Ð¸Ð´Ð²Ñ Ð·Ð¼ÑÐ½Ð½Ñ Ð¿Ð¾ÑилаÑÑÑÑÑ Ð½Ð° Ñой Ñамий обâÑкÑ
alert( a === b ); // true
Ð ÑÑÑ Ð´Ð²Ð° Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ñ Ð¾Ð±âÑкÑи не ÑÑвнÑ, Ñ Ð¾Ñа вони ÑÑ Ð¾Ð¶Ñ (обидва поÑожнÑ):
let a = {};
let b = {}; // два Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ñ Ð¾Ð±âÑкÑи
alert( a == b ); // false
ÐÐ»Ñ Ð¿Ð¾ÑÑвнÑнÑ, ÑакиÑ
Ñк obj1 > obj2, або Ð´Ð»Ñ Ð¿Ð¾ÑÑвнÑÐ½Ð½Ñ Ð· пÑимÑÑивом obj == 5, обâÑкÑи пеÑеÑвоÑÑÑÑÑÑÑ Ð½Ð° пÑимÑÑиви. ÐезабаÑом ми вивÑимо, Ñк пÑаÑÑÑÑÑ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв, але ÑеÑно кажÑÑи, ÑÐ°ÐºÑ Ð¿Ð¾ÑÑвнÑÐ½Ð½Ñ Ð¿Ð¾ÑÑÑÐ±Ð½Ñ Ð²ÐºÑай ÑÑдко â зазвиÑай вони зâÑвлÑÑÑÑÑÑ ÑеÑез помилки Ñ ÐºÐ¾Ð´Ñ.
Ðажливим побÑÑним еÑекÑом збеÑÑÐ³Ð°Ð½Ð½Ñ Ð¾Ð±âÑкÑÑв Ñк поÑÐ¸Ð»Ð°Ð½Ñ Ñ Ñе, Ñо обâÑкÑ, оголоÑений Ñк const, може бÑÑи змÑнений.
ÐапÑиклад:
const user = {
name: "Ðван"
};
user.name = "ÐеÑÑо"; // (*)
alert(user.name); // ÐеÑÑо
Ðоже здаÑиÑÑ, Ñо ÑÑдок (*) пÑизведе до помилки, але Ñе не Ñак. ÐнаÑÐµÐ½Ð½Ñ Ñ Ð·Ð¼ÑннÑй user Ñ Ð¿Ð¾ÑÑÑйним, воно завжди Ð¼Ð°Ñ Ð¿Ð¾ÑилаÑиÑÑ Ð½Ð° Ñой Ñамий обâÑкÑ, але влаÑÑивоÑÑÑ ÑÑого обâÑкÑа можÑÑÑ Ð·Ð¼ÑнÑваÑиÑÑ.
ÐнакÑе кажÑÑи, const user Ð²Ð¸Ð´Ð°Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ, лиÑе ÑкÑо ми намагаÑмоÑÑ Ð¿ÑиÑвоÑÑи Ñ ÑÐ°Ð¼Ñ Ð·Ð¼ÑÐ½Ð½Ñ ÑнÑе знаÑеннÑ: user = ....
ÐÑоÑе, ÑкÑо нам дÑйÑно поÑÑÑбно ÑÑвоÑÑваÑи незмÑÐ½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð¾Ð±âÑкÑа, Ñе Ñакож можливо, але з викоÑиÑÑаннÑм зовÑÑм ÑнÑÐ¸Ñ Ð¼ÐµÑодÑв. ÐÑо Ñе ми згадаÑмо Ñ ÑоздÑÐ»Ñ ÐÑапоÑи Ñа деÑкÑипÑоÑи влаÑÑивоÑÑей.
ÐлонÑÐ²Ð°Ð½Ð½Ñ Ñа злиÑÑÑ Ð¾Ð±âÑкÑÑв, Object.assign
ÐÑже, копÑÑÐ²Ð°Ð½Ð½Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ Ð¾Ð±âÑкÑа ÑÑвоÑÑÑ Ñе одне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñой Ñамий обâÑкÑ.
Ðле Ñо, ÑкÑо нам поÑÑÑбно ÑÑвоÑиÑи копÑÑ, клон обâÑкÑа?
Ðле ÑкÑо ми наÑпÑÐ°Ð²Ð´Ñ ÑÑого Ñ Ð¾Ñемо, Ñо нам поÑÑÑбно ÑÑвоÑиÑи новий обâÑÐºÑ Ñ Ð²ÑдÑвоÑиÑи ÑÑÑÑкÑÑÑÑ Ñинного, пеÑебиÑаÑÑи Ñа копÑÑÑÑи його влаÑÑивоÑÑÑ.
ÐапÑиклад Ñак:
let user = {
name: "Ðикола",
age: 30
};
let clone = {}; // новий поÑожнÑй об'ÑкÑ
// давайÑе ÑкопÑÑÑмо в нÑого вÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð· user
for (let key in user) {
clone[key] = user[key];
}
// ÑÐµÐ¿ÐµÑ clone Ñ Ð¿Ð¾Ð²Ð½ÑÑÑÑ Ð½ÐµÐ·Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ об'ÑкÑом з Ñим Ñамим вмÑÑÑом
clone.name = "ÐеÑÑо"; // змÑнив Ð´Ð°Ð½Ñ Ð² нÑомÑ
alert( user.name ); // знаÑÐµÐ½Ð½Ñ "Ðикола" вÑе Ñе в оÑигÑналÑÐ½Ð¾Ð¼Ñ Ð¾Ð±'ÑкÑÑ
Ðи Ñакож можемо ÑкоÑиÑÑаÑиÑÑ Ð¼ÐµÑодом Object.assign.
СинÑакÑиÑ:
Object.assign(dest, ...sources)
- ÐеÑÑий аÑгÑменÑ
destÑ ÑÑлÑовим обâÑкÑом. - ÐодалÑÑÑ Ð°ÑгÑменÑи â Ñе ÑпиÑок Ð²Ð¸Ñ ÑÐ´Ð½Ð¸Ñ Ð¾Ð±âÑкÑÑв.
ÐÑн копÑÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð²ÑÑÑ
виÑ
ÑдниÑ
обâÑкÑÑв Ñ ÑÑлÑовий dest, а поÑÑм повеÑÑÐ°Ñ Ð¹Ð¾Ð³Ð¾ Ñк ÑезÑлÑÑаÑ.
ÐапÑиклад, Ñ Ð½Ð°Ñ Ñ Ð¾Ð±âÑÐºÑ user, додаймо до нÑого паÑÑ Ð²Ð»Ð°ÑÑивоÑÑей з дозволами:
let user = { name: "Ðикола" };
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };
// копÑÑÑ Ð²ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð· permissions1 Ñа permissions2 в user
Object.assign(user, permissions1, permissions2);
// Ð¢ÐµÐ¿ÐµÑ user = { name: "Ðикола", canView: true, canEdit: true }
alert(user.name); // Ðикола
alert(user.canView); // true
alert(user.canEdit); // true
ЯкÑо ÑкопÑйована назва влаÑÑивоÑÑÑ Ð²Ð¶Ðµ ÑÑнÑÑ, вона бÑде пеÑезапиÑана:
let user = { name: "Ðикола" };
Object.assign(user, { name: "ÐеÑÑо" });
alert(user.name); // now user = { name: "ÐеÑÑо" }
Ðи Ñакож можемо викоÑиÑÑовÑваÑи Object.assign, Ñоб виконаÑи пÑоÑÑе клонÑÐ²Ð°Ð½Ð½Ñ Ð¾Ð±âÑкÑа:
let user = {
name: "Ðикола",
age: 30
};
let clone = Object.assign({}, user);
alert(clone.name); // Ðикола
alert(clone.age); // 30
ÐÑн копÑÑÑ Ð²ÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ user в поÑожнÑй обâÑÐºÑ Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð¹Ð¾Ð³Ð¾.
ÐÑнÑÑÑÑ Ñакож ÑнÑÑ Ð¼ÐµÑоди клонÑÐ²Ð°Ð½Ð½Ñ Ð¾Ð±âÑкÑа, напÑ. spread syntax clone = {...user}, ÑозглÑнÑÑÑ Ð´Ð°Ð»Ñ Ð² поÑÑбникÑ.
Ðкладене клонÑваннÑ
ÐоÑÑ Ð¼Ð¸ пÑипÑÑкали, Ñо вÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ user Ñ Ð¿ÑимÑÑивами. Ðле влаÑÑивоÑÑÑ Ð¼Ð¾Ð¶ÑÑÑ Ð±ÑÑи поÑиланнÑми на ÑнÑÑ Ð¾Ð±âÑкÑи.
ÐÑÑ Ñак:
let user = {
name: "Ðикола",
sizes: {
height: 182,
width: 50
}
};
alert( user.sizes.height ); // 182
Ð¢ÐµÐ¿ÐµÑ Ð½ÐµÐ´Ð¾ÑÑаÑнÑо ÑкопÑÑваÑи clone.sizes = user.sizes, ÑÐ¾Ð¼Ñ Ñо user.sizes Ñ Ð¾Ð±âÑкÑом Ñ Ð±Ñде ÑкопÑйовано за поÑиланнÑм, ÑÐ¾Ð¼Ñ clone Ñ user маÑимÑÑÑ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ñ sizes:
let user = {
name: "Ðикола",
sizes: {
height: 182,
width: 50
}
};
let clone = Object.assign({}, user);
alert( user.sizes === clone.sizes ); // true, Ñой же об'ÑкÑ
// user Ñа clone подÑлÑÑÑÑ sizes
user.sizes.width = 60; // змÑнÑÑмо влаÑÑивÑÑÑÑ Ð² Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¼ÑÑÑÑ
alert(clone.sizes.width); // 60, оÑÑимÑÑмо ÑезÑлÑÑÐ°Ñ Ð² ÑнÑомÑ
Щоб випÑавиÑи Ñе Ñа зÑобиÑи user Ñ clone ÑпÑÐ°Ð²Ð´Ñ Ð¾ÐºÑемими обâÑкÑами, ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑаÑи Ñикл клонÑваннÑ, Ñкий пеÑевÑÑÑÑ ÐºÐ¾Ð¶Ð½Ðµ знаÑÐµÐ½Ð½Ñ user[key] Ñ, ÑкÑо Ñе обâÑкÑ, Ñо Ñакож повÑоÑÑÑ Ð¹Ð¾Ð³Ð¾ ÑÑÑÑкÑÑÑÑ. Це називаÑÑÑÑÑ âглибоке клонÑваннÑ(deep cloning)â або âÑÑÑÑкÑÑÑне клонÑваннÑ(structured cloning)â. ÐÑнÑÑ Ð¼ÐµÑод structuredClone, Ñкий ÑеалÑзÑÑ Ñаке глибоке клонÑваннÑ.
structuredClone
Ðиклик structuredClone(object) клонÑÑ object з ÑÑÑма вкладеними влаÑÑивоÑÑÑми.
ÐÑÑ Ñк ми можемо викоÑиÑÑовÑваÑи Ñе в наÑÐ¾Ð¼Ñ Ð¿ÑикладÑ:
let user = {
name: "Ðикола",
sizes: {
height: 182,
width: 50
}
};
let clone = structuredClone(user);
alert( user.sizes === clone.sizes ); // false, ÑÑÐ·Ð½Ñ Ð¾Ð±'ÑкÑи
// user Ñа clone ÑÐµÐ¿ÐµÑ Ð°Ð±ÑолÑÑно не пов'ÑÐ·Ð°Ð½Ñ Ð¼Ñж ÑобоÑ
user.sizes.width = 60; // ÑÐµÐ¿ÐµÑ Ð·Ð¼ÑнÑÑмо влаÑÑивÑÑÑÑ Ð² Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¼ÑÑÑÑ
alert(clone.sizes.width); // 50, ÑнÑе мÑÑÑе не пов'Ñзане з попеÑеднÑм
ÐеÑод structuredClone може клонÑваÑи бÑлÑÑÑÑÑÑ ÑипÑв даниÑ
, ÑакиÑ
Ñк обâÑкÑи, маÑиви, пÑимÑÑÐ¸Ð²Ð½Ñ Ð·Ð½Ð°ÑеннÑ.
ÐÑн Ñакож пÑдÑÑимÑÑ ÑиклÑÑÐ½Ñ Ð¿Ð¾ÑиланнÑ, коли влаÑÑивÑÑÑÑ Ð¾Ð±âÑкÑа поÑилаÑÑÑÑÑ Ð½Ð° Ñам обâÑÐºÑ (безпоÑеÑеднÑо або ÑеÑез ланÑÑжок Ñи поÑиланнÑ).
ÐапÑиклад:
let user = {};
// давайÑе ÑÑвоÑимо ÑиклÑÑне поÑиланнÑ:
// user.me поÑилаÑÑÑÑÑ Ð½Ð° user
user.me = user;
let clone = structuredClone(user);
alert(clone.me === clone); // true
Як баÑиÑе, clone.me поÑилаÑÑÑÑÑ Ð½Ð° clone, а не на user! ÐÑже, ÑиклÑÑне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñакож бÑло клоновано пÑавилÑно.
ХоÑа бÑваÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, коли structuredClone не пÑаÑÑÑ.
ÐапÑиклад, коли обâÑÐºÑ Ð¼Ð°Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ Ð· ÑÑнкÑÑÑÑ:
// помилка
structuredClone({
f: function() {}
});
ÐлаÑÑивоÑÑÑ Ð· ÑÑнкÑÑÑми не пÑдÑÑимÑÑÑÑÑÑ.
ÐÐ»Ñ Ð¾Ð±Ñобки ÑÐ°ÐºÐ¸Ñ ÑÐºÐ»Ð°Ð´Ð½Ð¸Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв нам може знадобиÑиÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи комбÑнаÑÑÑ Ð¼ÐµÑодÑв клонÑваннÑ, напиÑаÑи ÑпеÑÑалÑний код або, Ñоб не Ð²Ð¸Ð½Ð°Ñ Ð¾Ð´Ð¸Ñи колеÑо, взÑÑи ÑÐ¸Ð½Ð½Ñ ÑеалÑзаÑÑÑ, напÑиклад _.cloneDeep(obj) Ñз бÑблÑоÑеки JavaScript lodash.
ÐÑдÑÑмки
ÐбâÑкÑи пÑиÑвоÑÑÑÑÑÑ Ñа копÑÑÑÑÑÑÑ Ð·Ð° поÑиланнÑм. ÐнакÑе кажÑÑи, змÑнна збеÑÑÐ³Ð°Ñ Ð½Ðµ âзнаÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑаâ, а âпоÑиланнÑâ (адÑеÑÑ Ð² памâÑÑÑ) на знаÑеннÑ. Тож копÑÑÐ²Ð°Ð½Ð½Ñ ÑÐ°ÐºÐ¾Ñ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ Ð°Ð±Ð¾ пеÑедаÑа ÑÑ Ñк аÑгÑменÑÑ ÑÑнкÑÑÑ ÐºÐ¾Ð¿ÑÑÑ Ñе поÑиланнÑ, а не Ñам обâÑкÑ.
УÑÑ Ð¾Ð¿ÐµÑаÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ ÑкопÑÐ¹Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ñ (напÑиклад, додаваннÑ/Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð»Ð°ÑÑивоÑÑей) виконÑÑÑÑÑÑ Ð½Ð°Ð´ Ñим Ñамим обâÑкÑом.
ÐÐ»Ñ ÑÑвоÑÐµÐ½Ð½Ñ âÑпÑавжнÑÐ¾Ñ ÐºÐ¾Ð¿ÑÑâ (клонÑ) ми можемо викоÑиÑÑовÑваÑи Object.assign Ð´Ð»Ñ Ñак Ð·Ð²Ð°Ð½Ð¾Ñ âповеÑÑ
Ð¾Ð²Ð¾Ñ ÐºÐ¾Ð¿ÑÑâ (Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð¾Ð±âÑкÑи копÑÑÑÑÑÑÑ Ð·Ð° поÑиланнÑм) або ÑÑнкÑÑÑ âглибокого клонÑваннÑâ, напÑиклад _.cloneDeep(obj).
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)