Estoy estudiando algo de código JS y, en comparación con otros idiomas, no tiene ningún sentido para mí. Primero, hay un objeto de fecha que se declara y que entiendo,
$ns.constant = { date: {}, /* Input date */ };
Luego hay funciones como esta a continuación donde se pasa una fecha a una función. Esto es lo que no entiendo. En otros lenguajes, cuando pasa una variable a una función, esa función crea una nueva variable que es local a la función y la función actúa sobre esa variable local.
Esta función devuelve date.julian. Pero también agrega otras fechas como date.j2000 y date.1950. En mi comprensión de otros idiomas, esos no se devuelven porque son el objeto de fecha local para la función. Me parece que para poner esos valores en la constante de fecha, tendría que devolver el objeto de fecha completo que creó la función y no solo date.julian. O, ¿js solo ve que se pasa esa fecha y de alguna manera sabe que es la fecha constante?
¿Esta función modifica la constante de fecha, un objeto que es local para la función o qué?
Gracias
$ns.julian.calc = function (date) { var centuries; var year; var month; var b = 0; var c; var e; year = date.year + 4800; if (date.year < 0) { year += 1; } month = date.month; if (month <= 2) { month += 12; year -= 1; } e = Math.floor ((306 * (month + 1)) / 10); centuries = Math.floor (year / 100); if (date.year <= 1582) { if (date.year == 1582) { if (date.month < 10) { b = -38; } if (date.month > 10 || date.day >= 15) { b = Math.floor ((centuries / 4) - centuries); } } else { b = -38; } } else { b = Math.floor ((centuries / 4) - centuries); } c = Math.floor ((36525 * year) / 100); date.julianDate = b + c + e + date.day - 32167.5; date.julianTime = (3600.0 * date.hours + 60.0 * date.minutes + date.seconds) / 86400.0; date.julian = date.julianDate + date.julianTime; date.j2000 = 2000.0 + (date.julian - $const.j2000) / 365.25; date.b1950 = 1950.0 + (date.julian - $const.b1950) / 365.25; date.j1900 = 1900.0 + (date.julian - $const.j1900) / 365.25; return date.julian; };
Parece que está pasando un "objeto" de fecha a su función y luego le agrega cosas, lo que hará que la fecha original pasada a esa función también se actualice, no solo localmente a la función.
En todos los idiomas, no solo javascript, los objetos y las referencias de montón se pasan por referencia, mientras que las variables de pila se pasan por valor (una copia local de la función). Un objeto, en cualquier idioma, se pasará por referencia y todo lo que cambie en ese objeto también hará que cambie el objeto original.
Eso se debe a que la "fecha" que está pasando es un puntero o una referencia a una ubicación de almacenamiento dinámico en la memoria donde está actualizando las cosas, por lo que cuando más tarde, fuera de esa función, use "fecha" nuevamente, todavía está apuntando a la misma dirección del montón donde actualizó las cosas. Cambiar los valores en una referencia de montón se reflejará en cualquier cosa que apunte a la misma referencia.
También puede confundirse con el funcionamiento de la inmutabilidad ya que declaró "fecha" como una constante, pero le asignó un objeto a esa fecha. Lo que eso significa es que la referencia a esa ubicación del montón (fecha) no puede cambiar, por lo que no podría hacer date = {}
ya que no puede reasignar una nueva dirección a ese puntero, sin embargo, los valores en ese objeto pueden aún cambian, no son inmutables, por lo que puede hacer algo como date.example = 'example'
. No conozco una estructura de datos en JS que sea recursivamente inmutable a menos que use algo como https://immutable-js.com/ .