Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Problema con valor por referencia

Estas en el tema de Problema con valor por referencia en el foro de Javascript en Foros del Web. Buenas tardes forer@s Llevo un buen rato con este tema pero esto ya me está volviendo loco. Defino una variable global de la siguiente forma ...
  #1 (permalink)  
Antiguo 08/08/2013, 17:11
Avatar de malakian  
Fecha de Ingreso: septiembre-2010
Ubicación: $malakian->Colombia();
Mensajes: 469
Antigüedad: 13 años, 7 meses
Puntos: 45
Problema con valor por referencia

Buenas tardes forer@s

Llevo un buen rato con este tema pero esto ya me está volviendo loco.

Defino una variable global de la siguiente forma

Código Javascript:
Ver original
  1. var places = [];

En otro proceso genero un objeto que se almacena en places, la estructura queda asi:

Código Javascript:
Ver original
  1. places[0] = {'price':2000,'full':false};
  2. places[1] = {'price':2500,'full':false};
  3. // etc etc etc

hasta ese momento bien, luego en otro punto necesito pasar el valor de la variable places a otra variable, por ejemplo placesFinal

Código Javascript:
Ver original
  1. placesFinal = places;

pero he aquí la sorpresa que he tenido, si modifico el valor de placesFinal, el valor de places cambia automaticamente y viceversa, como si estuvieran unidas...

estuve investigando un poco y creo que se trata de algo llamado tipos primitivos, consiste en que cuando una variable se define de esa forma el valor de la variable no se pasa por valor, (valga la redundancia), si no por referencia, cosa que aun no logro entender muy bien, agradecería si algun experto en JS me da una mano,

gracias
__________________
Guitar Loco, Desarrollador Web PHP
Sigueme: @jose1x
  #2 (permalink)  
Antiguo 08/08/2013, 17:25
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema con valor por referencia

Cita:
estuve investigando un poco y creo que se trata de algo llamado tipos primitivos, consiste en que cuando una variable se define de esa forma el valor de la variable no se pasa por valor, (valga la redundancia), si no por referencia, cosa que aun no logro entender muy bien, agradecería si algun experto en JS me da una mano,
buenas...
no es tan así. es por el tipo de dato. pongamos de esta manera, hay datos complejos y hay datos básicos. los complejos por lo general son aquellos que pueden almacenar más de una información y los básicos una sola información. los tipos complejos se pasan por referencia mientras los básicos se hace una copia del contenido. por tanto, cuando se pasan por referencia, cualquier cambio que hagas se ve afectado en cualquiera de las variables que tienen acceso a ese dato. el problema en javascript es que ese detalle no se puede controlar, sino que lo hace automaticamente el lenguaje utilizando como norma lo antes expuesto. si quieres hacer una copia de un dato complejo (array, objetos), lo más fácil es serializarlo a JSON y luego parsearlo.

Código:
var a = [0,1,2,3];
var b= JSON.parse(JSON.stringify(a)); // esta linea es la que serializa y parse ;
b.pop();
console.log(a,b);
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 09/08/2013, 15:16
Avatar de malakian  
Fecha de Ingreso: septiembre-2010
Ubicación: $malakian->Colombia();
Mensajes: 469
Antigüedad: 13 años, 7 meses
Puntos: 45
Respuesta: Problema con valor por referencia

hola zerokilled me funcionó el código, pero quedo con un "sin sabor", es decir, esto es un error del lenguaje como tal? esta mal diseñado?

Muchas Gracias
__________________
Guitar Loco, Desarrollador Web PHP
Sigueme: @jose1x
  #4 (permalink)  
Antiguo 09/08/2013, 15:26
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años
Puntos: 343
Respuesta: Problema con valor por referencia

Es una decisión de diseño, podes compartirla o no.

En lo personal me parece correcto el comportamiento, lo unico que faltaria es alguna herramienta para hacer deep-copy de objetos.

Si tu array no tuviese objetos adentro, digamos que fuese una lista de strings podrias usar el método concat para obtener una copia:

Código Javascript:
Ver original
  1. var myList = ['a', 'b', 'c'];
  2. var myCopy = myList.concat();
__________________
blog | @aijoona
  #5 (permalink)  
Antiguo 09/08/2013, 15:28
Avatar de malakian  
Fecha de Ingreso: septiembre-2010
Ubicación: $malakian->Colombia();
Mensajes: 469
Antigüedad: 13 años, 7 meses
Puntos: 45
Respuesta: Problema con valor por referencia

Hola,

En este momento no la comparto por que no hay una forma de hacer el "deep-copy" correctamente o de una forma "nativa"

de todos modos muchas gracias por las respuestas, muy valiosas.
__________________
Guitar Loco, Desarrollador Web PHP
Sigueme: @jose1x

Etiquetas: js, referencia, valor, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:52.