javascript - objeto - object.assign typescript
JS: ¿Object.assign() crea una copia profunda o una copia superficial? (4)
Acabo de encontrar este concepto de
var copy = Object.assign({}, originalObject);
que crea una copia del objeto original en el objeto " copy
". Sin embargo, mi pregunta es, ¿esta forma de clonar un objeto crea una copia profunda o una copia superficial?
PD: La confusión es que si crea una copia profunda, entonces sería la forma más fácil de clonar un objeto.
Al usar Object.assign()
, en realidad estás haciendo una Copia superficial de tu objeto. Cada vez que hacemos una operación como asignar un objeto a otro, en realidad realizamos una copia superficial, es decir, si OBJ1 es un objeto, modificarlo a través de otro objeto que sea OBJ2 también reflejará los cambios en OBJ1.
Crea una copia superficial, de acuerdo con este párrafo de MDN :
Para la clonación profunda, necesitamos usar otras alternativas porque Object.assign () copia los valores de propiedad. Si el valor de origen es una referencia a un objeto, solo copia ese valor de referencia.
Para los propósitos de redux, Object.assign()
es suficiente porque el estado de una aplicación redux solo contiene valores inmutables (JSON).
Olvídese de la copia profunda, incluso la copia superficial no es segura, si el objeto que está copiando tiene una propiedad con un atributo enumerable
establecido en falso.
MDN:
El método Object.assign () solo copia propiedades enumerables y propias de un objeto de origen a un objeto de destino
toma este ejemplo
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
Para Data structures
pequeñas, veo que JSON.stringify()
y JSON.parse()
funcionan 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)