web-dev-qa-db-fra.com

JS: Object.assign () crée-t-il une copie complète ou une copie superficielle

Je viens de tomber sur ce concept de

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

qui crée une copie de l'objet d'origine dans l'objet "copy". Cependant, ma question est, cette façon de cloner un objet crée-t-elle une copie complète ou une copie superficielle?

PS: La confusion est que si elle crée une copie complète, ce serait le moyen le plus simple de cloner un objet.

35
Shivi

Oubliez la copie en profondeur, même la copie superficielle n'est pas sûre, si l'objet que vous copiez a une propriété avec l'attribut enumerable défini sur false.

MDN:

La méthode Object.assign () copie uniquement les propriétés énumérables et propres d'un objet source vers un objet cible

prenez cet exemple

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

En utilisant Object.assign(), vous faites en fait Shallow Copy de votre objet. Chaque fois que nous effectuons une opération comme l'attribution d'un objet à un autre, nous effectuons en fait une copie superficielle, c'est-à-dire si OBJ1 est un objet, le modifier via un autre objet qui est OBJ2 reflétera également les changements dans OBJ1.

18
Rish

Il crée une copie superficielle, selon ce paragraphe de MDN :

Pour le clonage en profondeur, nous devons utiliser d'autres alternatives car Object.assign () copie les valeurs des propriétés. Si la valeur source est une référence à un objet, elle copie uniquement cette valeur de référence.

Aux fins de redux, Object.assign() est suffisant car l'état d'une application redux ne contient que des valeurs immuables (JSON).

8
Bihn Kim

Pour les petits Data structures Je vois que JSON.stringify() et JSON.parse() fonctionnent bien.

// 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

D'autres réponses sont compliquées.
Certains ne répondent pas du tout à la question.

Ci-dessous a travaillé pour moi

// 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));

J'espère que ça t'as aidé.

0