in

¿JavaScript pasa por referencia?

apple touch icon@2

Mis dos centavos … Es irrelevante si JavaScript pasa parámetros por referencia o valor. Lo que realmente importa es la asignación frente a la mutación.

Escribí una explicación más larga y detallada en este enlace.

Cuando pasa algo (ya sea un objeto o una primitiva), todo lo que hace JavaScript es asignar una nueva variable mientras está dentro de la función … al igual que usar el signo igual (=).

La forma en que ese parámetro se comporta dentro de la función es exactamente igual a como se comportaría si acabara de asignar una nueva variable usando el signo igual … Tome estos simples ejemplos.

var myString = 'Test string 1';

// Assignment - A link to the same place as myString
var sameString = myString;

// If I change sameString, it will not modify myString,
// it just re-assigns it to a whole new string
sameString = 'New string';

console.log(myString); // Logs 'Test string 1';
console.log(sameString); // Logs 'New string';

Si tuviera que pasar myString como parámetro de una función, se comporta como si simplemente lo asignara a una nueva variable. Ahora, hagamos lo mismo, pero con una función en lugar de una simple asignación.

function myFunc(sameString) {

  // Reassignment... Again, it will not modify myString
  sameString = 'New string';
}

var myString = 'Test string 1';

// This behaves the same as if we said sameString = myString
myFunc(myString);

console.log(myString); // Again, logs 'Test string 1';

La única razón por la que puede modificar objetos cuando los pasa a una función es porque no está reasignando … En cambio, los objetos se pueden cambiar o mutar … Nuevamente, funciona de la misma manera.

var myObject = { name: 'Joe'; }

// Assignment - We simply link to the same object
var sameObject = myObject;

// This time, we can mutate it. So a change to myObject affects sameObject and visa versa
myObject.name="Jack";
console.log(sameObject.name); // Logs 'Jack'

sameObject.name="Jill";
console.log(myObject.name); // Logs 'Jill'

// If we re-assign it, the link is lost
sameObject = { name: 'Howard' };
console.log(myObject.name); // Logs 'Jill'

Si tuviera que pasar myObject como parámetro de una función, se comporta como si simplemente lo asignara a una nueva variable. Nuevamente, lo mismo con el mismo comportamiento exacto pero con una función.

function myFunc(sameObject) {
  // We mutate the object, so the myObject gets the change too... just like before.
  sameObject.name="Jill";

  // But, if we re-assign it, the link is lost
  sameObject = {
    name: 'Howard'
  };
}

var myObject = {
  name: 'Joe'
};

// This behaves the same as if we said sameObject = myObject;
myFunc(myObject);
console.log(myObject.name); // Logs 'Jill'

Cada vez que pasas una variable a una función, estás «asignando» a cualquiera que sea el nombre del parámetro, como si usaras el igual = firmar.

Recuerda siempre que el signo igual = significa cesión. Y pasar un parámetro a una función también significa asignación. Son iguales y las dos variables están conectadas exactamente de la misma manera.

La única vez que la modificación de una variable afecta a una variable diferente es cuando el objeto subyacente está mutado.

No tiene sentido hacer una distinción entre objetos y primitivas, porque funciona exactamente de la misma manera que si no tuviera una función y solo usara el signo igual para asignar una nueva variable.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

60 142811 1519038104

¿Números complejos en Python?

B82fa98zhoa7Eh8yw9KTNo 1200 80

Harry Potter: Wizards Unite hechizo de energía: cómo obtener más energía de hechizo