Creé una matriz para contener mis objetos 3D, pero la iteración para realizar cambios no funciona como se esperaba. ¿Cuál es la diferencia entre estos dos bloques de código y cómo puedo cambiar el bucle for en consecuencia? objects solo contiene los objetos 3D que se almacenan con los nombres de las variables dados en el segundo bloque de código. Simplemente no entiendo cómo estos dos serían diferentes.
objects.forEach((obj, index) => { objects[index] = obj.children[0]; objects[index].angle = 0; });versus
sun.angle = 0; mercury = mercury.children[0]; mercury.angle = 0; venus = venus.children[0]; venus.angle = 0; earth = earth.children[0]; earth.angle = 0;El segundo bloque de código funciona aquí, pero el primero no.
Sospecho que desea que la asignación de objects[index] = obj.children[0] cambie a lo que apunta la variable para el primer planeta, pero no es así como funcionan las referencias a objetos. Este diagrama podría ayudar a explicar:
let moon = { children: [] } let earth = { children: [ moon ] } let objects = [ earth ];En la memoria esto se ve así:
earth --------> { <-------------------+ children: [ | <ref-moon> -----+ | } | | | | moon ---------> { children: [] } <--+ | | objects -----> [ | <ref-earth> -----------+ ] Entonces, earth es una variable que apunta al objeto en la memoria, y los objects[0] también apuntan al mismo objeto. Si tuviera que ejecutar el código objects[0] = earth.children[0] , terminaríamos con esto en el diagrama:
earth --------> { children: [ <ref-moon> -----+ } | / moon ---------> { children: [] } <-+---+ | objects -----> [ | <ref-moon> -----------+ ] Verá que la earth todavía apunta al objeto que originalmente hizo, pero los objects[0] ahora apuntan a su hijo en su lugar. Sospecho que pensaste que lo siguiente sería equivalente, pero no lo son:
La asignación en la primera línea no cambia la earth variable en absoluto.
Esto se debe a que cada variable (tierra, luna, objetos) es solo una referencia a un objeto en la memoria. Lo importante a entender es la diferencia entre cambiar una referencia y cambiar el objeto al que se refiere. El siguiente ejemplo de código demuestra el concepto un poco más directamente.
let obj1 = { id: 'red' } let obj2 = { id: 'blue' } let array = [ obj1, obj2 ] obj1 = obj2 // now both variables point to blue console.log('obj1 is blue:', obj1) console.log('obj2 is blue:', obj2) console.log('but array still has red:', array)