Рубрики
Без рубрики

Разные методы для копирования объекта в JavaScript

Различные методы для копирования объекта JavaScript

Автор оригинала: Juned Lanja.

В этом посте мы обсудим различные методы для копирования объекта JavaScript и обсудить результат каждого метода.

Но до того, как только имейте в виду одну вещь, что объекты JavaScript являются Meatable по природе и хранится в качестве ссылки. Поэтому, когда вы назначаете объект другой переменной, вы просто назначаете адрес памяти объекта к этой переменной.

В этом случае ваш старый и новый объект оба укажет один и тот же адрес памяти. Любые изменения в любом объекте будут отражены в другом. Поэтому только назначение единого объекта к другому не будет копировать ваш объект !!!

// Define object bar
var bar = {
   x : 'Hi'
}
console.log(bar.x);  //Hi

// Assign it to foo
var foo = bar;
console.log(foo.x);  //Hi

//But
foo.x = 'Hello!! Im foo.';
console.log(foo.x);  //Hello!! Im foo.
console.log(bar.x);  //Hello!! Im foo.

bar.x = "Nice to meet you foo!!";
console.log(foo.x);  //Nice to meet you foo!!
console.log(bar.x);  //Nice to meet you foo!!

Как вы видите в приведенном выше примере, оба Foo и бар отражают изменения, сделанные в любом объекте.

Но у нас нет 3 Короткий и сладкий метод, который вы можете использовать для копирования объекта.

Малая копия с использованием Spread Syntax или Object.Ascign

Распространение синтаксиса

Этот самый короткий и простой способ копирования/объединения объекта. См. Пример ниже:

var obj = { foo: "foo", bar: "bar" };

var clonedObj = { ...obj };
// Object { foo: "foo", bar: "bar" }

Объект.assign

Метод Object.Assign () может использоваться для копирования значений всех перечислимых собственных свойств от одного или нескольких исходных объектов в целевой объект, и он вернет целевой объект.

var obj = { foo: "foo", bar: "bar" };

var clonedObj = Object.assign({}, obj);
// Object { foo: "foo", bar: "bar" }

Используя синтаксис распространения или объекта. Назначить () – это стандартный способ копирования объекта в JavaScript. Обе методологии могут быть эквивалентно используются для копирования/объединения перечислимых свойств объекта к другому объекту.

Проблема С этими двумя подходами это просто сделает Малая копия Отказ Неглубокая копия – это битная копия объекта. Создан новый объект, который имеет точную копию значений в исходном объекте. Но если какие-либо из полей объекта являются ссылки на другие объекты, просто справочные адреса копируются, то есть только адрес памяти копируется. Изменение такого эталонного поля будет отражено на обоих объектах. Смотрите ниже пример.

let obj = { a: 0 , b: { c: 0}};
let copySpread = {...obj};
let copyOA = Object.assign({}, obj);
console.log(JSON.stringify(obj)); // { a: 0, b: { c: 0}}
  
obj.a = 1;
console.log(JSON.stringify(obj)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(copySpread)); // { a: 0, b: { c: 0}}
console.log(JSON.stringify(copyOA)); // { a: 0, b: { c: 0}}
  
copySpread.a = 2;
console.log(JSON.stringify(obj)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(copySpread)); // { a: 2, b: { c: 0}}
console.log(JSON.stringify(copyOA)); // { a: 0, b: { c: 0}}
  
copyOA.a = 3;
console.log(JSON.stringify(obj)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(copySpread)); // { a: 2, b: { c: 0}}
console.log(JSON.stringify(copyOA)); // { a: 3, b: { c: 0}}

obj.b.c = 4;
console.log(JSON.stringify(obj)); // { a: 1, b: { c: 4}}
console.log(JSON.stringify(copySpread)); // { a: 2, b: { c: 4}}
console.log(JSON.stringify(copyOA)); // { a: 3, b: { c: 4}}

Таким образом, эти два метода короткие и очень полезны, но оно не будет отработать, когда вы вложенный объект в вашем объекте, который будет скопирован.

Глубокая копия, используя json.stringify и json.parse

Глубокая копия возникает, когда объект скопирован вместе с объектами, к которым он относится. Это можно легко сделать, используя комбинацию Json.stringify и Json.parse создать глубокую копию.

В этом методе мы первым Json.stringify () Объект JSON и снова разбирает его, чтобы вернуть объект JSON. Json.parse () Метод определяет строку JSON и создает значение JavaScript или объект, описанный строкой. Эти новые объектные поля будут иметь свой собственный адрес памяти и будут независимы от глубоко вложенных полей объектов

Смотрите ниже пример, Deepclone Объект не будет иметь никакого эффекта, если основной исходный объект obj модифицирован и наоборот.

 // Deep Clone
  obj = { a: 0 , b: { c: 0}};
  let deepClone = JSON.parse(JSON.stringify(obj));
  obj.a = 5;
  obj.b.c = 5;
  console.log(JSON.stringify(obj)); // { a: 5, b: { c: 5}}
  console.log(JSON.stringify(deepClone)); // { a: 0, b: { c: 0}}
  
  deepClone.a = 6;
  deepClone.b.c = 6;
  console.log(JSON.stringify(obj)); // { a: 5, b: { c: 5}}
  console.log(JSON.stringify(deepClone)); // { a: 6, b: { c: 6}}

Или вы можете написать свою собственную функцию, чтобы сделать глубокую копию/клонирование.

Обертывание

  1. Помните, что объекты JavaScript являются смежными и хранятся посредством ссылки.
  2. Object.Assign () или Speed Syntax можно использовать для копирования, но это будет неглубокая копия.
  3. Json. Stringify и Json. Разбор можно использовать для глубокой копии.
  4. Вы можете создать свою собственную функцию, чтобы сделать глубокую копию или использовать сторонние библиотеки, такие как Load Lodash, подчеркивание или многие доступные там.