estoy copiando objA a objB
const objA = { prop: 1 }, const objB = objA; objB.prop = 2; console.log(objA.prop); // logs 2 instead of 1mismo problema para Arrays
const arrA = [1, 2, 3], const arrB = arrA; arrB.push(4); console.log(arrA.length); // `arrA` has 4 elements instead of 3.Está claro que tiene algunos conceptos erróneos sobre lo que significa la instrucción var tempMyObj = myObj; hace.
En JavaScript, los objetos se pasan y se asignan por referencia (más precisamente, el valor de una referencia), por lo que tempMyObj y myObj son ambas referencias al mismo objeto.
Aquí hay una ilustración simplificada que puede ayudarlo a visualizar lo que está sucediendo.
// [Object1]<--------- myObj var tempMyObj = myObj; // [Object1]<--------- myObj // ^ // | // ----------- tempMyObjComo puede ver después de la asignación, ambas referencias apuntan al mismo objeto.
Necesita crear una copia si necesita modificar uno y no el otro.
// [Object1]<--------- myObj const tempMyObj = Object.assign({}, myObj); // [Object1]<--------- myObj // [Object2]<--------- tempMyObjRespuesta antigua:
Aquí hay un par de otras formas de crear una copia de un objeto.
Como ya estás usando jQuery:
var newObject = jQuery.extend(true, {}, myObj);Con vainilla JavaScript
function clone(obj) { if (null == obj || "object" != typeof obj) return obj; var copy = obj.constructor(); for (var attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; } return copy; } var newObject = clone(myObj);objeto de clonación profunda con JSON.parse() y JSON.stringify
// Deep Clone obj = { a: 0 , b: { c: 0}}; let deepClone = JSON.parse(JSON.stringify(obj));referencia: este artículo
Mejor referencia : este artículo
Para resumir todo, y como aclaración, hay tres formas de copiar un objeto JS.
const a = { x: 0} const b = a; bx = 1; // also updates ax...{} u Object.assign() . const a = { x: 0, y: { z: 0 } }; const b = {...a}; // or const b = Object.assign({}, a); bx = 1; // doesn't update ax byz = 1; // also updates ayz const a = { x: 0, y: { z: 0 } }; const b = JSON.parse(JSON.stringify(a)); byz = 1; // doesn't update ayzObject.create() crea un nuevo objeto. Las propiedades se comparten entre los objetos (cambiando uno también cambia el otro). La diferencia con una copia normal es que las propiedades se agregan bajo el prototipo __proto__ del nuevo objeto. Cuando nunca cambia el objeto original, esto también podría funcionar como una copia superficial, pero sugeriría usar uno de los métodos anteriores, a menos que necesite específicamente este comportamiento.