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.
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
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.
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).
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)
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é.