Los tipos primitivos (número, cadena, etc.) se pasan por valor, pero los objetos son desconocidos, ya que ambos pueden pasar por valor (en caso de que consideremos que una variable que contiene un objeto es, de hecho, una referencia al objeto ) y pasado por referencia (cuando consideramos que la variable del objeto contiene el objeto mismo).
Aunque realmente no importa al final, quiero saber cuál es la forma correcta de presentar los argumentos pasando convenciones. ¿Hay un extracto de la especificación de JavaScript, que define cuál debería ser la semántica al respecto?
javascript
pass-by-reference
pass-by-value
Danail Nachev
fuente
fuente
var x=3, y=x; f(x); alert(y === x);
funciónf()
puede hacer el informe de alertafalse
y notrue
. En JavaScript, eso no es posible, por lo que no es una referencia de paso. Es bueno que sea posible pasar referencias a objetos modificables, pero eso no es lo que significa "pasar por referencia". Como dije, es una pena que la terminología sea tan confusa.Respuestas:
Es interesante en JavaScript. Considere este ejemplo:
Esto produce la salida:
obj1
no fuera una referencia en absoluto, el cambioobj1.item
no tendría ningún efecto en elobj1
exterior de la función.num
sería100
, yobj2.item
leería"changed"
.En cambio, la situación es que el elemento pasado se pasa por valor. Pero el elemento que se pasa por valor es en sí mismo una referencia. Técnicamente, esto se llama llamada por compartir .
En términos prácticos, esto significa que si cambia el parámetro en sí (como con
num
yobj2
), eso no afectará el elemento que se introdujo en el parámetro. Pero si cambia los INTERNOS del parámetro, se propagará una copia de seguridad (como conobj1
).fuente
item
propiedad del objeto al que hace referencia obj1, está cambiando el valor de la propiedad del elemento que se configuró originalmente como "sin cambios". Cuando asigna a obj2 un valor de {item: "changed"}, está cambiando la referencia a un nuevo objeto (que inmediatamente queda fuera de alcance cuando la función sale). Se hace más evidente lo que sucede si nombra los parámetros de la función cosas como numf, obj1f y obj2f. Entonces ves que los params estaban ocultando los nombres var externos.ref
palabra clave). Por lo general, la función devolvería el nuevo objeto y la asignación en el punto donde llama a la función. Por ejemplo, enfoo = GetNewFoo();
lugar deGetNewFoo(foo);
var obj1 = { item: 'unchanged' }; var obj2 = obj1; obj2.item = 'changed';
y observaría el mismo efecto que en su ejemplo. Por lo tanto, personalmente remito la respuesta de Tim GoodmanSiempre pasa por valor, pero para los objetos el valor de la variable es una referencia. Debido a esto, cuando pasa un objeto y cambia sus miembros , esos cambios persisten fuera de la función. Esto hace que parezca pasar por referencia. Pero si realmente cambia el valor de la variable del objeto, verá que el cambio no persiste, lo que demuestra que realmente pasa por valor.
Ejemplo:
Salida:
fuente
changeObject
, he cambiadox
para contener una referencia al nuevo objeto.x = {member:"bar"};
es equivalente ax = new Object(); x.member = "bar";
lo que estoy diciendo también es cierto de C #, por cierto.ref
palabra clave que puede pasar la referencia por referencia (en lugar del predeterminado de pasar la referencia de valor), y entonces el cambio a punto a unanew Object()
le persistir .La variable no "retiene" el objeto; Tiene una referencia. Puede asignar esa referencia a otra variable, y ahora ambas hacen referencia al mismo objeto. Siempre pasa por valor (incluso cuando ese valor es una referencia ...).
No hay forma de alterar el valor que posee una variable pasada como parámetro, lo que sería posible si JavaScript admitiera pasar por referencia.
fuente
Mis dos centavos ... Así es como lo entiendo. (Siéntase libre de corregirme si me equivoco)
Es hora de tirar todo lo que sabe sobre pasar por valor / referencia.
Porque en JavaScript, no importa si se pasa por valor o por referencia o lo que sea. Lo que importa es la mutación frente a la asignación de los parámetros pasados a una función.
OK, déjame hacer todo lo posible para explicar lo que quiero decir. Digamos que tienes algunos objetos.
Lo que hemos hecho es "asignación" ... Hemos asignado 2 objetos vacíos separados a las variables "objeto1" y "objeto2".
Ahora, digamos que nos gusta mejor object1 ... Entonces, "asignamos" una nueva variable.
A continuación, por cualquier motivo, decidimos que nos gusta más el objeto 2. Entonces, simplemente hacemos una pequeña reasignación.
No le pasó nada al objeto1 ni al objeto2. No hemos cambiado ningún dato en absoluto. Todo lo que hicimos fue reasignar cuál es nuestro objeto favorito. Es importante saber que object2 y favoriteObject están asignados al mismo objeto. Podemos cambiar ese objeto a través de cualquiera de esas variables.
OK, ahora veamos primitivas como cadenas por ejemplo
De nuevo, elegimos un favorito.
Nuestras variables favoriteString y string1 se asignan a 'Hello world'. Ahora, ¿qué pasa si queremos cambiar nuestra cadena favorita? ¿¿¿Lo que sucederá???
Uh oh ... lo que ha pasado. No pudimos cambiar string1 cambiando a favoriteString ... ¿Por qué? Porque no cambiamos nuestro objeto de cadena . Todo lo que hicimos fue "RE ASIGNAR" la variable favoriteString a una nueva cadena. Esto esencialmente lo desconectó de la cadena1. En el ejemplo anterior, cuando cambiamos el nombre de nuestro objeto, no asignamos nada. (Bueno, no a la variable en sí , ... sin embargo, asignamos la propiedad de nombre a una nueva cadena.) En cambio, simplemente mutamos el objeto que mantiene las conexiones entre las 2 variables y los objetos subyacentes. (Incluso si hubiéramos querido modificar o mutar el objeto de cadena en sí, no podríamos haberlo hecho, porque las cadenas son realmente inmutables en JavaScript).
Ahora, a las funciones y a pasar parámetros ... Cuando llamas a una función y pasas un parámetro, lo que estás haciendo esencialmente es una "asignación" a una nueva variable, y funciona exactamente igual que si simplemente te asignaras usando el signo igual (=)
Toma estos ejemplos.
Ahora, lo mismo, pero con una función
Bien, ahora demos algunos ejemplos usando objetos en su lugar ... primero, sin la función.
Ahora, lo mismo, pero con una llamada a función
OK, si lees toda esta publicación, quizás ahora comprendas mejor cómo funcionan las llamadas a funciones en JavaScript. No importa si algo se pasa por referencia o por valor ... Lo que importa es la asignación frente a la mutación.
Cada vez que pasa una variable a una función, está "Asignando" a cualquiera que sea el nombre de la variable del parámetro, al igual que si usara el signo igual (=).
Recuerde siempre que el signo igual (=) significa asignación. Recuerde siempre que pasar un parámetro a una función en JavaScript también significa asignación. Son las mismas y las 2 variables están conectadas exactamente de la misma manera (es decir, no lo son, a menos que cuente que están asignadas al mismo objeto).
El único momento en que "modificar una variable" afecta a una variable diferente es cuando el objeto subyacente está mutado (en cuyo caso no ha modificado la variable, sino el objeto en sí).
No tiene sentido hacer una distinción entre objetos y primitivas, porque funciona de la misma manera que si no tuviera una función y solo utilizara el signo igual para asignar a una nueva variable.
El único problema es cuando el nombre de la variable que pasa a la función es el mismo que el nombre del parámetro de la función. Cuando esto sucede, debe tratar el parámetro dentro de la función como si fuera una variable completamente nueva y privada para la función (porque lo es)
fuente
foo(char *a){a="hello";}
no hace nada, pero si lo hacefoo(char *a){a[0]='h';a[1]='i';a[2]=0;}
, se cambia afuera porquea
es una ubicación de memoria pasada por valor que hace referencia a una cadena (matriz de caracteres). Se permite pasar estructuras (similares a los objetos js) por valor en C, pero no se recomienda. JavaScript simplemente impone estas mejores prácticas y oculta los elementos innecesarios y generalmente no deseados ... y seguramente facilita la lectura.source = { "id":"1"}; copy = source /*this is wrong*/; copy.id="2"
esa fuente siga siendo {"id": "1"}?Considera lo siguiente:
Entonces,
olvídate de "pasar por referencia / valor", no te obsesiones con "pasar por referencia / valor" porque:Para responder a su pregunta: se pasan los punteros.
Algunos comentarios finales:
fuente
{'George', 1}
valores, pero solo uso uno de ellos a la vez, ¿cómo se gestionan los demás? ¿Y qué sucede cuando asigno una variable al valor de otra variable? ¿Estoy señalando un puntero o señalando al puntero del operando correcto? ¿Elvar myExistingVar = {"blah", 42}; var obj = myExistingVar;
resultadoobj
apunta a{"blah", 42}
o haciamyExistingVar
?1)
ejecuté un perfil de memoria en las herramientas de desarrollo del navegador para una función de bucle como la que describió y vi picos en el uso de la memoria durante todo el proceso de bucle. Esto parecería indicar que se están creando nuevos objetos idénticos en cada iteración del bucle. Cuando las espinas caen repentinamente, el recolector de basura acaba de limpiar un grupo de estos objetos no utilizados.2)
Con respecto a algo comovar a = b
, javascript no proporciona un mecanismo para usar punteros y, por lo tanto, una variable nunca puede apuntar a un puntero (como puede hacerlo en C), aunque el motor de javascript subyacente los usa indudablemente. Entonces ...var a = b
señalaráa
"a la punta del operando correcto"Un objeto fuera de una función se pasa a una función dando una referencia al objeto exterior.
Cuando usa esa referencia para manipular su objeto, el objeto externo se ve afectado. Sin embargo, si dentro de la función decidió señalar la referencia a otra cosa, no afectó en absoluto al objeto externo, porque lo único que hizo fue redirigir la referencia a otra cosa.
fuente
Piénselo así: siempre pasa por valor. Sin embargo, el valor de un objeto no es el objeto en sí, sino una referencia a ese objeto.
Aquí hay un ejemplo, pasando un número (un tipo primitivo)
Repetir esto con un objeto produce resultados diferentes:
Un ejemplo más:
fuente
Una explicación muy detallada acerca de copiar, pasar y comparar por valor y por referencia está en este capítulo del libro "JavaScript: la guía definitiva" encontrará .
fuente
JavaScript siempre es paso por valor ; todo es de tipo de valor.
Los objetos son valores, y las funciones miembro de los objetos son valores en sí mismos (recuerde que las funciones son objetos de primera clase en JavaScript). Además, con respecto al concepto de que todo en JavaScript es un objeto ; esto está mal. Las cadenas, símbolos, números, booleanos, nulos e indefinidos son primitivos .
En ocasiones, pueden aprovechar algunas funciones y propiedades miembro heredadas de sus prototipos base, pero esto es solo por conveniencia. No significa que sean objetos en sí mismos. Pruebe lo siguiente como referencia:
En ambas alertas encontrará que el valor no está definido.
fuente
x = "teste"; x.foo = 12;
etc. El hecho de que una propiedad no sea persistente no significa que no sea un objeto. Como dice MDN: en JavaScript, casi todo es un objeto. Todos los tipos primitivos, excepto nulo e indefinido, se tratan como objetos. Se les pueden asignar propiedades (las propiedades asignadas de algunos tipos no son persistentes) y tienen todas las características de los objetos. enlaceEn JavaScript, el tipo de valor controla únicamente si ese valor se asignará por copia de valor o por copia de referencia .
Los valores primitivos siempre se asignan / pasan por value-copy :
null
undefined
ES6
Los valores compuestos siempre se asignan / pasan por copia de referencia
Por ejemplo
En el fragmento anterior, porque
2
es una primitiva escalar,a
contiene una copia inicial de ese valor yb
se le asigna otra copia del valor. Al cambiarb
, de ninguna manera está cambiando el valora
.Pero ambos
c
yd
son referencias separadas al mismo valor compartido[1,2,3]
, que es un valor compuesto. Es importante tener en cuenta que ni elc
nid
más "posee" el[1,2,3]
valor - ambos son iguales sólo referencias a los compañeros del valor. Por lo tanto, cuando se usa cualquiera de las referencias para modificar (.push(4)
) elarray
valor compartido real en sí, solo afecta al valor compartido, y ambas referencias harán referencia al valor recién modificado[1,2,3,4]
.Cuando hacemos la tarea
b = [4,5,6]
, no estamos haciendo absolutamente nada para afectar a dóndea
todavía se hace referencia ([1,2,3]
). Para hacer eso,b
tendría que ser un puntero ena
lugar de una referencia aarray
- ¡pero no existe tal capacidad en JS!Cuando pasamos el argumento
a
, asigna una copia de laa
referencia ax
.x
ya
son referencias separadas que apuntan al mismo[1,2,3]
valor. Ahora, dentro de la función, podemos usar esa referencia para mutar el valor en sí (push(4)
). Pero cuando hacemos la asignaciónx = [4,5,6]
, esto no afecta de ninguna manera a dóndea
apunta la referencia inicial , todavía apunta a (ahora modificado)[1,2,3,4]
.Para pasar efectivamente un valor compuesto (como un
array
) por value-copy, debe hacer una copia manualmente de él, de modo que la referencia pasada no apunte al original. Por ejemplo:Valor compuesto (objeto, matriz, etc.) que se puede pasar por copia de referencia
Aquí,
obj
actúa como un contenedor para la propiedad primitiva escalara
. Cuando se pasa afoo(..)
, se pasa una copia de laobj
referencia y se establece en elwrapper
parámetro. Ahora podemos usar lawrapper
referencia para acceder al objeto compartido y actualizar su propiedad. Una vez que finalice la función,obj.a
verá el valor actualizado42
.Fuente
fuente
bueno, se trata de 'rendimiento' y 'velocidad' y en la simple palabra 'gestión de memoria' en un lenguaje de programación.
en javascript podemos poner valores en dos capas: type1 -
objects
y type2 -todos los demás tipos de valor comostring
&boolean
& etc.si imagina la memoria como los cuadros a continuación, que en cada uno de ellos solo se puede guardar un valor tipo2
cada valor type2 (verde) es un cuadrado único, mientras que un valor type1 (azul) es un grupo de ellos :
El punto es que si desea indicar un valor de tipo 2, la dirección es simple, pero si desea hacer lo mismo para el valor de tipo 1, ¡eso no es nada fácil! :
y en una historia más complicada:
así que aquí las referencias pueden rescatarnos:
mientras que la flecha verde aquí es una variable típica, la púrpura es una variable de objeto, así que debido a que la flecha verde (variable típica) tiene solo una tarea (y eso indica un valor típico) no necesitamos separar su valor de así que movemos la flecha verde con el valor de eso donde quiera que vaya y en todas las tareas, funciones, etc.
pero no podemos hacer lo mismo con la flecha morada, es posible que queramos mover la celda 'John' aquí o muchas otras cosas ..., por lo que la flecha morada se mantendrá en su lugar y solo las flechas típicas que se le asignaron se moverán ...
Una situación muy confusa es donde no puede darse cuenta de cómo cambia su variable referenciada, echemos un vistazo a un muy buen ejemplo:
fuente
Esta es una explicación más para pasar por valor y pasar por referencia (JavaScript). En este concepto, están hablando de pasar la variable por referencia y pasar la variable por referencia.
Pasar por valor (tipo primitivo)
Pase por referencia (objetos)
c
y señala algo de memoria, digamos (0x012).d
apunta a la misma ubicación (0x012).Caso especial, pase por referencia (objetos)
fuente
c
se establece en una copia de la referencia del nuevo objeto.En JavaScript, al asignar un objeto a una variable, el valor asignado a la variable es una referencia al objeto:
fuente
¡¡Semántica!! Establecer definiciones concretas necesariamente hará que algunas respuestas y comentarios sean incompatibles, ya que no describen la misma cosa incluso cuando se usan las mismas palabras y frases, pero es fundamental superar la confusión (especialmente para los nuevos programadores).
En primer lugar, hay múltiples niveles de abstracción que no todos parecen comprender. Los programadores más nuevos que han aprendido lenguajes de 4ta o 5ta generación pueden tener dificultades para comprender conceptos familiares para los ensambladores o programadores en C que no son eliminados por punteros a punteros a punteros. Pasar por referencia no significa simplemente la capacidad de cambiar un objeto referenciado usando una variable de parámetro de función.
Variable : concepto combinado de un símbolo que hace referencia a un valor en una ubicación particular de la memoria. Este término generalmente está demasiado cargado para usarse solo en la discusión de detalles.
Símbolo : cadena de texto utilizada para referirse a la variable (es decir, el nombre de la variable).
Valor : bits particulares almacenados en la memoria y referenciados mediante el símbolo de la variable.
Ubicación de la memoria : donde se almacena el valor de una variable. (La ubicación en sí está representada por un número separado del valor almacenado en la ubicación).
Parámetro de función : Variable declarada en una definición de función, utilizada para hacer referencia a variables pasadas a la función.
Argumento de la función : Variable fuera de la función que el llamante pasa a la función.
Variable de objeto : Variable cuyo valor subyacente básico no es el "objeto" en sí mismo, sino que su valor es un puntero (valor de ubicación de memoria) a otra ubicación en la memoria donde se almacenan los datos reales del objeto. En la mayoría de los lenguajes de generación superior, el aspecto de "puntero" está efectivamente oculto por la referencia automática en varios contextos.
Variable primitiva : Variable cuyo valor ES el valor real. Incluso este concepto puede ser complicado por el auto-boxeo y los contextos similares a objetos de varios idiomas, pero la idea general es que el valor de la variable ES el valor real representado por el símbolo de la variable en lugar de un puntero a otra ubicación de memoria.
Los argumentos y parámetros de la función no son lo mismo. Además, el valor de una variable no es el objeto de la variable (como ya han señalado varias personas, pero aparentemente ignorado). Estas distinciones son críticas para la comprensión adecuada.
Pass-by-value o Call-by-sharing (para objetos): El valor del argumento de la función es COPIADO a otra ubicación de memoria a la que hace referencia el símbolo del parámetro de la función (independientemente de si está en la pila o en el montón). En otras palabras, el parámetro de función recibió una copia del valor del argumento pasado ... Y (crítico) el valor del argumento NUNCA SE ACTUALIZA / ALTERA / CAMBIA por la función de llamada. Recuerde, el valor de una variable de objeto NO es el objeto en sí, sino que es el puntero al objeto, por lo que pasar una variable de objeto por valor copia el puntero a la variable del parámetro de función. El valor del parámetro de función apunta exactamente al mismo objeto en la memoria. Los datos del objeto en sí pueden modificarse directamente a través del parámetro de función, PERO el valor del argumento de la función NUNCA SE ACTUALIZA, por lo que continuará apuntando a mismoobjeto durante e incluso después de la llamada a la función (incluso si los datos de su objeto fueron alterados o si el parámetro de la función tiene asignado un objeto completamente diferente). Es incorrecto concluir que el argumento de la función se pasó por referencia solo porque el objeto al que se hace referencia es actualizable a través de la variable del parámetro de la función.
Llamar / Pasar por referencia : el valor del argumento de la función puede / será actualizado directamente por el parámetro de función correspondiente. Si ayuda, el parámetro de función se convierte en un "alias" efectivo para el argumento: se refieren efectivamente al mismo valor en la misma ubicación de memoria. Si un argumento de función es una variable de objeto, la capacidad de cambiar los datos del objeto no es diferente del caso de paso por valor ya que el parámetro de función todavía apuntará al mismo objeto que el argumento. Pero en el caso de la variable de objeto, si el parámetro de función se establece en un objeto completamente diferente, entonces el argumento también apuntará al objeto diferente; esto no sucede en el caso de pasar por valor.
JavaScript no pasa por referencia. Si lees atentamente, te darás cuenta de que todas las opiniones contrarias no entienden lo que se entiende por paso por valor y concluyen falsamente que la capacidad de actualizar los datos de un objeto a través del parámetro de función es sinónimo de "paso por valor".
Copia / copia de objeto: se crea un nuevo objeto y se copian los datos del objeto original. Esto puede ser una copia profunda o una copia superficial, pero el punto es que se crea un nuevo objeto. Crear una copia de un objeto es un concepto separado del paso por valor. Algunos lenguajes distinguen entre objetos de clase y estructuras (o similares), y pueden tener un comportamiento diferente para pasar variables de los diferentes tipos. Pero JavaScript no hace nada como esto automáticamente al pasar variables de objeto. Pero la ausencia de clonación automática de objetos no se traduce en paso por referencia.
fuente
JavaScript pasa tipos primitivos por valor y tipos de objetos por referencia
- Brian Bi - ¿Qué lenguajes de programación se pasan por referencia?
Actualizar
Aquí hay una refutación a esto:
No hay "pasar por referencia" disponible en JavaScript.
fuente
Mi manera simple de entender esto ...
Al llamar a una función, está pasando el contenido (referencia o valor) de las variables de argumento, no las variables en sí.
Dentro de la función, variables de parámetros
inVar1
yinVar2
recibir los contenidos que se pasan.Desde que
inVar2
recibió la referencia de{ prop: 2 }
, puede cambiar el valor de la propiedad del objeto.fuente
Pasar argumentos a una función en JavaScript es análogo a pasar parámetros por valor de puntero en C:
fuente
Para los abogados de lenguaje de programación, revisé las siguientes secciones de ECMAScript 5.1 (que es más fácil de leer que la última edición) y llegué a preguntar en la lista de correo de ECMAScript.
TL; DR : Todo pasa por valor, pero las propiedades de los Objetos son referencias, y la definición de Objeto carece de forma espeluznante en el estándar.
Construcción de listas de argumentos
La Sección 11.2.4 "Listas de argumentos" dice lo siguiente al producir una lista de argumentos que consta de solo 1 argumento:
La sección también enumera casos en los que la lista de argumentos tiene 0 o> 1 argumentos.
Por lo tanto, todo se pasa por referencia.
Acceso a las propiedades del objeto
Sección 11.2.1 "Accesores de propiedades"
Por lo tanto, las propiedades de los objetos siempre están disponibles como referencia.
En referencia
En la sección 8.7, "Tipo de especificación de referencia", se describe que las referencias no son tipos reales en el idioma, solo se usan para describir el comportamiento de los operadores de eliminación, typeof y asignación.
Definición de "objeto"
En la edición 5.1 se define que "Un objeto es una colección de propiedades". Por lo tanto, podemos inferir que el valor del objeto es la colección, pero en cuanto a cuál es el valor de la colección está mal definido en la especificación y requiere un poco de esfuerzo para comprenderlo.
fuente
Los documentos de MDN lo explican claramente, sin ser demasiado detallado:
Fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Description
fuente
En un lenguaje de bajo nivel, si desea pasar una variable por referencia, debe usar una sintaxis específica en la creación de la función:
El
&age
es una referencia amyAge
, pero si desea el valor tiene que convertir la referencia, utilizando*age
.Javascript es un lenguaje de alto nivel que realiza esta conversión por usted. Entonces, aunque los objetos se pasan por referencia, el lenguaje convierte el parámetro de referencia al valor. No necesita usar
&
, en la definición de la función, para pasarlo por referencia, ni*
, en el cuerpo de la función, para convertir la referencia al valor, JS lo hace por usted.Es por eso que cuando intenta cambiar un objeto dentro de una función, al reemplazar su valor (es decir
age = {value:5}
), el cambio no persiste, pero si cambia sus propiedades (es decir,age.value = 5
), lo hace.Aprende más
fuente
He leído estas respuestas varias veces, pero REALMENTE no lo entendí hasta que aprendí acerca de la definición técnica de "Llamar al compartir", como lo llama Barbara Liskov
Es decir, las referencias de parámetros pueden modificarse si va y accede al valor del parámetro en sí. Por otro lado, la asignación a un parámetro desaparecerá después de la evaluación, y la persona que llama la función no puede acceder a ella.
fuente
La forma más simple
fuente
JSON.parse( JSON.stringify( obj ) )
es una forma horrible de clonar objetos profundos. No solo no solo es lento, sino que también puede causar la pérdida de datos.He encontrado que el método extendido de la biblioteca Underscore.js es muy útil cuando quiero pasar un objeto como un parámetro que puede modificarse o reemplazarse por completo.
fuente
La explicación más sucinta que encontré fue en la guía de estilo de AirBNB :
Primitivas : cuando accedes a un tipo primitivo trabajas directamente en su valor
P.ej:
Complejo : cuando accede a un tipo complejo, trabaja en una referencia a su valor
P.ej:
Es decir, los tipos primitivos efectivamente se pasan por valor, y los tipos complejos se pasan por referencia.
fuente
Yo diría que es pasar por copia.
Tenga en cuenta que los argumentos y los objetos variables son objetos creados durante el contexto de ejecución creado al comienzo de la invocación de la función, y su valor / referencia real pasado a la función simplemente se almacena en estos argumentos + objetos variables.
En términos simples, para los tipos primitivos, los valores se copian al comienzo de la llamada a la función, para el tipo de objeto, se copia la referencia.
fuente
Hay un poco de debate sobre el uso del término "paso por referencia" en JavaScript aquí , pero para responder a su pregunta:
(Del artículo mencionado anteriormente).
fuente
Una manera fácil de determinar si algo es "pasar por referencia" es si puede escribir una función de "intercambio". Por ejemplo, en C, puedes hacer:
Si no puede hacer el equivalente de eso en JavaScript, no es "pasar por referencia".
fuente
Array and Object se pasa como pasar por referencia o pasar por valor basado en estas dos condiciones.
si está cambiando el valor de ese objeto o matriz con un nuevo objeto o matriz, entonces se pasa por valor.
object1 = {item: "car"}; array1=[1,2,3];
aquí está asignando un nuevo objeto o matriz al anterior. no está cambiando el valor de la propiedad del objeto antiguo. por lo tanto, se pasa por valor.
si está cambiando el valor de una propiedad de un objeto o matriz, entonces se pasa por Referencia.
object1.key1= "car"; array1[0]=9;
aquí está cambiando el valor de una propiedad del objeto antiguo. No está asignando un nuevo objeto o matriz al anterior. Por lo tanto, se pasa por referencia.
Código
fuente
fuente
Los valores simples dentro de las funciones no cambiarán esos valores fuera de la función (se pasan por valor), mientras que los complejos sí (se pasan por referencia).
fuente