it-swarm.com.ru

JS: Object.assign () создает глубокую копию или мелкую копию

Я только сталкивался с этой концепцией

var copy = Object.assign({}, originalObject);

который создает копию оригинального объекта в объект "copy". Однако мой вопрос заключается в том, создает ли этот способ клонирования объект глубокую копию или мелкую копию?

PS: путаница в том, что если он создает глубокую копию, то это будет самый простой способ клонировать объект.

35
Shivi

Забудьте о глубоком копировании, даже мелкое копирование небезопасно, если копируемый объект имеет свойство с атрибутом enumerable, установленным в false.

MDN:

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

возьми этот пример

var o = {};

Object.defineProperty(o,'x',{enumerable: false,value : 15});

var ob={}; 
Object.assign(ob,o);

console.log(o.x); // 15
console.log(ob.x); // undefined
31
Ramanlfc

Используя Object.assign(), вы фактически делаете Shallow Copy вашего объекта. Всякий раз, когда мы выполняем такую ​​операцию, как присвоение одного объекта другому, мы фактически выполняем поверхностное копирование, т. Е. Если OBJ1 является объектом, изменение его с помощью другого объекта OBJ2 также будет отражать изменения в OBJ1.

18
Rish

Это создает поверхностную копию, согласно этот абзац из MDN :

Для глубокого клонирования нам нужно использовать другие альтернативы, потому что Object.assign () копирует значения свойств. Если исходное значение является ссылкой на объект, оно копирует только это ссылочное значение.

Для целей избыточности достаточно Object.assign(), поскольку состояние приложения избыточности содержит только неизменяемые значения (JSON).

8
Bihn Kim

Для маленьких _Data structures_ я вижу, что JSON.stringify() и ​​JSON.parse() работают хорошо.

_// store as JSON
var copyOfWindowLocation = JSON.stringify(window.location)
console.log("JSON structure - copy:", copyOfWindowLocation)
// convert back to Javascript Object
copyOfWindowLocation = JSON.parse(copyOfWindowLocation)
console.log("Javascript structure - copy:", copyOfWindowLocation)
_
5
Marian07

Другие ответы сложны.
Некоторые вообще не отвечают на вопрос.

Ниже работал на меня

// orignal object with deep keys
var originalObject = {
    k1: "v1",
    k2: "v2",
    deepObj: {
        k3: "v3",
        k4: "v4"
    }
};

// make copies now
var copy1 = JSON.parse(JSON.stringify(originalObject));
var copy2 = JSON.parse(JSON.stringify(originalObject));

Надеюсь, это поможет.

0
Manohar Reddy Poreddy