Клонирование объекта в 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.