Клонирането на обект в JS не е подобно изживяване като клонирането на променлива в JS.

Ако присвоим един обект на друг обект, тогава данните не се копират, но препратката [място в паметта] се копира.

Проблем при копиране на обекти

let obj = {
  name: "sarika",
};

let user = obj;
user.name = "siddanta";

console.log(obj); //siddanta
console.log(user); //siddanta

Плитко копие срещу дълбоко копие

При плитко копиране се копира само първото ниво на обектите. При дълбоко копиране всички нива, т.е. вложени обекти, също се копират.

Плитко копие

Има два начина, по които можем да направим плитко копиране в JS.

  1. Използване на Object.assign()
  2. Използване на оператор за разпространение (…)

Използване на object.assign()

let obj = {
    name: "sarika",
};
let user = object.assign({}, obj);
  
user.name = "siddanta";

console.log("object is: ", obj); // Object is sarika
console.log("User is: ", user); // User is siddanta

Използване на оператор за разпространение (…)

let obj = {
    name: "sarika",
};
  
let user = { ...obj };
  
user.name = "siddanta";

console.log("object is: ", obj); // Object is sarika
console.log("User is: ", user); // User is siddanta

Дълбоко копие

Използваме JSON.parse() и JSON.stringify() за дълбоко копиране в JS. В дълбоко копие JS копира всички членове на стария обект, разпределя отделно място в паметта за новия обект и след това присвоява копираните членове на новия обект.

let obj = {
  name: "sarika",
  address: {
    city: "Pokhara",
  },
};

let user = JSON.parse(JSON.stringify(obj));
user.name = "siddanta";
user.address.city = "Kathmandu";
console.log("object is: ", obj); //Object is: name: "sarika", address: "Pokhara"
console.log("User is: ", user);  //User is: name: "siddanta", address: "Kathmandu"

Ограничение: Не можете да копирате функции и дати/часове с дълбоко копиране.

Заключение

Следователно плиткото копие не ни помага да копираме вложените обекти, докато дълбокото копие ни помага да копираме вложените обекти и се използва за копиране на обектите в JS.