En esta conferencia, quiero hablar rápidamente sobre
cómo funciona exactamente para pasar argumentos a funciones.
Y esto se remonta al video que teníamos
sobre primitivos versus objetos,
que, recuerda, también llamamos
tipos primitivos y tipos de referencia.
Así que esta es una especie de revisión de esa conferencia,
pero aplicado a funciones, porque es súper importante
que entendemos realmente cómo las primitivas y los objetos
trabajo en el contexto de las funciones.
Entonces, dibujemos un ejemplo rápido y simple aquí.
Así que establezcamos un número de vuelo aquí,
234,
y un objeto,
que es básicamente un pasajero,
que en este caso soy yo.
Así que nombre, Jonas
Schmedtmann,
y luego algún número de pasaporte al azar.
Así que digamos esto, y por cierto,
Ya podría tener todo este código aquí como repetitivo,
así en los archivos de inicio, pero creo firmemente
que es mejor escribir el código aquí en un video,
porque entonces te ves obligado a escribir el código tú mismo,
y segundo, hace que los ejemplos
mucho más fácil de entender.
De todos modos, ahora quiero crear una función de registro.
Entonces, básicamente cuando el pasajero ya ha
compró el vuelo y luego está listo para facturar
para tomar el vuelo,
y luego digamos, ahí necesitamos un número de vuelo,
y luego también un objeto pasajero,
que contiene datos sobre el propio pasajero.
Así que básicamente llamaríamos a esta función así.
Entonces con el vuelo que ya tenemos aquí arriba,
y el objeto Jonas, en este caso.
Muy bien, este es nuestro vuelo, LH234.
Y este es nuestro pasajero,
pero ahora digamos que se cambió el número del vuelo.
Y eso puede suceder en la función de registro.
Y ahora cambiemos ese parámetro de número de vuelo aquí,
y esto no suele ser una buena práctica para hacer,
por lo que no debe cambiar los parámetros de una función,
pero esto es solo para hacer un punto.
Así que digamos que por alguna razón,
el número ahora cambió a LH999,
y también cambiaré el nombre del pasajero,
y eso es porque en la aviación,
por lo general siempre agregan un señor o una señora,
delante del nombre, está bien.
Así que hagámoslo, señor,
y luego solo el nombre del pasajero.
Así que estos son algunos cambios que hace la función de registro.
Y luego, antes de registrarnos,
solo verificará si el número de pasaporte es correcto.
Así que digamos si el pasaporte del punto del pasajero
es igual a este,
y supongamos que esta función
obtiene estos datos de alguna base de datos,
que contiene los vuelos reservados, a la derecha,
entonces en este caso, si el pasaporte es correcto,
entonces vamos a alertar, registrarnos,
Y además,
alerta,
pasaporte equivocado.
Bien, y esta parte aquí hará
un poco más de sentido al final de la conferencia.
¿Bueno?
Y ahora lo que quiero hacer es registrar tanto el vuelo
y el objeto Jonas a la consola
después de llamar a esta función de registro.
Entonces, vuelo,
y Jonás.
Bueno.
Y ahora, mientras guardo esto, ¿qué les parece?
Qué va a pasar con estas dos variables aquí?
¿Puedes tratar de anticiparlo?
basado en el código que tenemos aquí?
Entonces, de todos modos, veamos ahora, y aquí nos registramos,
que por ahora no es muy importante,
pero luego lo que obtenemos es el número de vuelo,
que sigue siendo LH234,
tan exactamente como lo definimos aquí,
aunque parece que fue redefinido aquí,
así que realmente no lo fue.
Y luego también obtenemos el objeto Jonas,
pero ahora el nombre se cambia de hecho a Sr. Jonas Schmedtmann.
Y ese es este cambio aquí,
eso sucedió dentro de la función, ¿verdad?
Así que tal vez en realidad viste venir este resultado,
porque en realidad hemos visto que esto sucede
a veces antes, pero analicémoslo de todos modos.
Así que este vuelo aquí es un tipo primitivo, ¿verdad?
Es solo una cuerda.
Y cuando pasamos ese valor a la función aquí abajo,
entonces el número de vuelo aquí es básicamente una copia
de ese valor original, ¿verdad?
Así que el número de vuelo contiene una copia,
y no simplemente el valor original de la variable vuelo.
Así que esto sería exactamente lo mismo que escribir
número de vuelo es igual
vuelo.
Y esto también simplemente copiaría
este valor a flightNum, ¿verdad?
Y así de nuevo,
flightNum aquí es una variable completamente diferente.
Y por lo tanto, como lo cambiamos aquí,
no se reflejó en la variable de vuelo exterior.
Bien, entonces sigue siendo LH234,
así que exactamente por la misma razón que vimos antes,
en la clase de primitivos versus tipos de referencia.
Pero ahora, ¿qué pasa con el objeto Jonas que pasamos,
en la función checkIn y en esa función,
se llama pasajero no?
Y luego cambiamos ese objeto pasajero aquí.
Y como vimos entonces,
el objeto Jonas también se vio afectado por ese cambio.
Entonces, ¿por qué sucedió eso?
Y es posible que ya sepas la respuesta.
Entonces, cuando pasamos un tipo de referencia a una función,
lo que se copia es realmente solo una referencia
al objeto en el montón de memoria.
Así que eso sería exactamente como hacer esto.
Así que pasajero
es igual
jonas
De hecho, podemos hacer esto y aquí lo mismo,
solo para obtener como referencia, lo mismo que hacer,
bueno, entonces, como ya sabes,
cuando tratamos de copiar un objeto como este,
en realidad solo estamos copiando la referencia
a ese objeto en el montón de memoria,
pero ambos apuntan al mismo objeto en la memoria.
Y eso es exactamente lo que también está sucediendo aquí,
con el objeto Jonas, mientras lo pasamos
en la función de checkIn donde se llama pasajero.
Así que aquí, mientras manipulamos el objeto pasajero,
es exactamente lo mismo que manipular el objeto Jonas.
Una vez más, porque ambos son
el mismo objeto en el montón de memoria.
Muy bien, en resumen, pasar un tipo primitivo
a una función es realmente lo mismo
como crear una copia como esta, fuera de la función.
Entonces el valor simplemente se copia.
Por otro lado, cuando pasamos un objeto a una función,
es realmente como copiar un objeto como este.
Y entonces, lo que sea que cambiemos en una copia
también sucederá en el original.
Ahora, por supuesto, tenemos que tener cuidado.
con este comportamiento y siempre tenlo en cuenta.
Eso es porque el hecho de que los objetos
comportarse de esta manera cuando se pasa a funciones
puede tener consecuencias imprevisibles en grandes bases de código.
Y eso es especialmente cierto cuando estás trabajando
con múltiples desarrolladores.
Así que escribamos otra función rápida aquí
para mostrarte lo que puede pasar,
para que puedas estar preparado para la vida real, básicamente.
Así que vamos a crear una función llamada
nuevo Pasaporte.
Aceptará a cualquier persona,
y básicamente simplemente cambiará
el número de pasaporte de esa persona.
Entonces, simplemente creemos un número aleatorio aquí,
al azar, y vamos a multiplicarlo por un número enorme,
y luego esto creará un número
entre uno y
esta cosa enorme
Así que realmente no importa aquí.
También conoceremos trunc, como hemos usado antes,
solo para que obtengamos un nuevo número grande,
que será el nuevo pasaporte ahora, a la derecha.
Y ahora llamemos a esa función en realidad,
con el objeto Jonas,
ahora a la derecha.
Así que digamos que reservé el vuelo
con mi número de pasaporte original aquí.
Y ese es el número de pasaporte.
que la función de registro comparará mi pasaporte con,
es por eso que está codificado aquí.
Pero ahora, nuevamente, cambio mi pasaporte antes de registrarme.
Y entonces vamos a ver qué pasa entonces.
Así que aquí de nuevo, tenemos que pasar
el vuelo y el objeto pasajero.
Entonces, veamos.
Así que todavía dice registrado aquí,
pero eso viene de esta llamada a la función checkIn, está bien.
Entonces aquí abajo, se cambia el pasaporte,
y luego hay otra llamada de verificación.
Así que vamos a ver el resultado de eso.
Y ahora, de hecho, dice pasaporte incorrecto, está bien.
Entonces, lo que está sucediendo ahora es que tenemos
dos funciones que manipulan el mismo objeto.
Y eso está creando un problema,
¿bien?
Así que aquí está pasando exactamente lo mismo,
en la nueva función de pasaporte.
Estoy pasando en un objeto,
y entonces ese objeto aquí se llama persona.
Y como la función manipula ese objeto persona,
por supuesto, también se refleja en Jonas.
Y luego, cuando pasamos ese objeto Jonas
en la función checkIn, entonces, por supuesto,
ese pasaporte ya no es el mismo que el original.
Entonces, sí, creo que este es un buen ejemplo.
de ver cómo la interacción de diferentes funciones
con el mismo objeto puede crear algunos problemas aquí.
Y por supuesto, esto es solo un ejemplo súper simple,
pero estoy seguro de que entiendes el punto, ¿verdad?
Lo que importa es que seas consciente de este problema,
y luego puedes tener cuidado con eso.
Simplemente eliminemos estas líneas de código.
También estos, estos realmente no importan.
Solo asegurémonos, y de hecho, sí,
tenemos el pasaporte equivocado ahora,
debido a la nueva función de pasaporte allá abajo.
Bueno.
Ahora, solo para terminar, en programación,
hay dos términos que se usan todo el tiempo
cuando se trata de funciones,
que pasa por valor y pasa por referencia,
y muchos programadores experimentados que son nuevos en JavaScript
hay alguna confusión entre estos términos
y cómo funciona en JavaScript.
Y entonces quiero abordar eso rápidamente aquí también.
Entonces JavaScript no tiene paso por referencia,
solo pasando por valor,
aunque parece que está pasando por referencia.
Así que hay lenguajes como C++,
donde puede pasar una referencia a cualquier valor,
en lugar del valor mismo.
Esto funciona incluso con primitivas,
por lo que podría pasar una referencia al valor de cinco,
y luego el valor original,
fuera de la función, se cambiaría.
Y esto se llama pasar por referencia.
Pero una vez más, JavaScript no tiene paso por referencia.
Así que si ya sabes algo de programación,
pero eres nuevo en JavaScript, asegúrate de entender esto.
Y sé que es confuso, porque como acabamos de aprender,
para los objetos, de hecho pasamos una referencia.
Así que la dirección de memoria del objeto.
Sin embargo, esa referencia en sí misma sigue siendo un valor.
Es simplemente un valor que contiene una dirección de memoria.
Así que básicamente pasamos una referencia a la función,
pero no pasamos por referencia,
y esta es una distinción importante.
Una vez mas,
Solo te digo esto porque parece haber
hay mucha confusión sobre este tema
entre algunos principiantes de JavaScript, y especialmente
cuando provienen de otros lenguajes, como C++.