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.

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