Encuesta JS: adivina el resultado

B
var obj1 = { value: 1 }
var obj2 = { value: 2 }

function change(a, b) {
   a = b;
}

change(obj1, obj2)

console.log(obj1);

¿Qué debería mostrar ese console.log?

* Pregunta de entrevista que suele fallar un número gigante de entrevistados.

HeXaN

Siendo JS lo raro sería que mostrase algo con un mínimo de sentido.

3 2 respuestas
Hiervan

NaN

Sonos

diría que debería devolver {value:1} no? y supongo que la mayoría responde que es value:2 pero ese sería el valor de a y no de obj1.

1 2 respuestas
Wasd

#4 Correcto. Supongo que es una pregunta trampa por aquello de que los objetos van por referencia.
Si en vez de hacer a = b haces a.newValue = 2, el console.log te pintará { value: 1, newValue: 2 }.

Vamos, que en un caso a != obj1 y en otro a == obj1.

3 1 respuesta
elfito

No termino de captar como se pasan en JS objetos como parametros, pero quiero entender que para que el console salga un {value:2} la función debería ser a.value=b.value;

eondev

#4 #5 pero en js los objetos pasados van por referencia, si obj1 apunta a obj2 no entiendo como va a valer 1. Lo esperable es que se muestre el valor de la referencia de obj2.

1 respuesta
Unrack

#7 Creo que también entra el scope en la función.

NeV3rKilL

¿ejecución asíncrona dando por culo?

Sí, el resultado es: Object { value: 1 }

Si metes el console log dentro de la función sí da el value: 2.

Fyn4r

Pero si los objetos se pasan por referencia estas haciendo que a apunte a b...

Tuskus

Pues te diría que tendría que ser {value:2}, en teoria ahora apuntarian los dos a la misma referencia, ¿No?

Pero ya he visto que el resultado es {value:1} xD. ¿Es por el scope de las funciones en JS?

C

El pase es por valor creo y no por referencia.

_Rpv

Deberías poner uno de estos semanal

3
B

value 1.

crb2222

En js siempre van por referencia los objetos, pero estáis confundidos pensando que ‘a’ es ‘obj1’ cuando son dos variables independientes que referencian al mismo objeto

Estas modificando ‘a’, no el valor del objeto que referencia ‘a’

2 1 respuesta
brew

Pero si esto es algo que se ve en la primera media hora de js

Fyn4r

#15 pero entonces eso no es una referencia, es una puta mierda xD

Al final tenía razón el pato

RTeks

No es una cosa de referencias, tiene que ver con los scopes.

crb2222

Tenéis que quedaros en que a !== obj1 y a.value === obj1.value

Cuando modificas ‘a’ en si misma, haciendo que apunte a ‘b’ no estas modificando obj1

1 1 respuesta
B

No se supone que pasas un apuntador de los obj cuando llamas la función? Entonces a y b sólo existen dentro de la función.

1
Fyn4r

#19 Ay, y que este lenguaje sea tomado en serio

1 respuesta
crb2222

#21 A riesgo de pillarme los dedos, esto pasa en muchos lenguajes, luego lo confirmo.

Alfinal hay que ver una referencia como un int con un valor numérico que hace referencia a una dirección de memoria, si tu modificas este valor numerico, en este caso por el valor de la direccion de ‘b’, no modificas per se el contenido de esa dirección de memoria, ni por asomo el valor numerico del puntero obj1

PD: confirmo que esto pasa igual en Java

1 1 respuesta
Fyn4r

#22 Mi problema está en que en C por ejemplo, tu eres consciente en todo momento de si estás trabajando con el puntero o con el contenido referenciado por él. Aquí lo veo mucho más difuso, quizá es falta de práctica, nu ze

Ranthas

Que la gente siga diciendo que en Java existe paso de parámetros por referencia me hace morir por dentro.

Xustis

Me das el código y estamos usando una web...

Las pregntas de mierda para entrevistas mejor dejarlas en las entrevistas.

pdt: no se como se puede fallar en una mierda así

B

Pero que cojones, no entiendo que está pasando

1 respuesta
NeV3rKilL

#26 Que en #2 se acabó el hilo y estamos aquí dándole vueltas a la perdiz.

D4rKNiGhT

La pregunta esta chula la verdad, hay que tener siempre ojo con referenciar a los objetos y se agradecería más preguntas como estas diarías por aprender pequeños detalles, en todo caso no entiendo lo de #2. A mi me resulta mucho más cómodo leerlo/entenderlo que el espageti de php.

1 respuesta
B

#28 No sé macho, pero justo este ejercicio en PHP se escribe igual cambiando console.log() por print()

isvidal

Menuda pregunta de mierda no, si declaras y seteas una propiedad y no la modificas nunca, va a devolver siempre lo que le seteaste.