variable valor una referencia por paso pasar parametros globales funciones funcion entre desde arreglos javascript reference pass-by-reference pass-by-value

javascript - una - valor por referencia js



Javascript por referencia vs. por valor (4)

Esta pregunta ya tiene una respuesta aquí:

Estoy buscando un buen material de lectura completo sobre cuándo Javascript pasa algo por valor y cuando por referencia y al modificar un elemento pasado afecta el valor fuera de una función y cuando no. También me interesa que la asignación a otra variable sea por referencia en lugar de por valor y si esto sigue reglas diferentes a las que se pasan como un parámetro de función.

He buscado mucho y he encontrado muchos ejemplos específicos (muchos de ellos aquí en SO) a partir de los cuales puedo comenzar a juntar piezas de las reglas reales, pero aún no he encontrado un solo documento bien escrito lo describe todo

Además, ¿hay formas en el lenguaje para controlar si algo se pasa por referencia o por valor?

Estos son algunos de los tipos de preguntas que quiero entender. Estos son solo ejemplos: en realidad estoy tratando de entender las reglas por las que pasa el idioma, no solo las respuestas a ejemplos específicos. Pero, aquí hay algunos ejemplos:

function f(a,b,c) { a = 3; b.push("foo"); c.first = false; } var x = 4; var y = ["eeny", "miny", "mo"]; var z = {first: true}; f(x,y,z);

¿Cuándo se cambian los contenidos de x, y y z fuera del alcance de f para todos los tipos diferentes?

function f() { var a = ["1", "2", "3"]; var b = a[1]; a[1] = "4"; // what is the value of b now for all possible data types that the array in "a" might hold? } function f() { var a = [{yellow: "blue"}, {red: "cyan"}, {green: "magenta"}]; var b = a[1]; a[1].red = "tan"; // what is the value of b now and why? b.red = "black"; // did the value of a[1].red change when I assigned to b.red? }

Si quiero hacer una copia totalmente independiente de un objeto (sin referencias en absoluto), ¿cuál es la mejor manera de hacerlo?


  1. Tipo de variable primitiva como cadena, el número siempre se pasa como pase por valor.
  2. La matriz y el objeto se pasan como paso por referencia o se pasan por valor en función de 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 a uno antiguo. 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, se pasa por Referencia.

      object1.item= "car"; array1[0]=9;

    Aquí está cambiando un valor de propiedad del objeto antiguo. No está asignando un nuevo objeto o matriz a uno antiguo. Por lo tanto, se pasa por referencia.

Código

function passVar(object1, object2, number1) { object1.key1= "laptop"; object2 = { key2: "computer" }; number1 = number1 + 1; } var object1 = { key1: "car" }; var object2 = { key2: "bike" }; var number1 = 10; passVar(object1, object2, number1); console.log(object1.key1); console.log(object2.key2); console.log(number1); Output: - laptop bike 10


Javascript siempre pasa por valor. Sin embargo, si pasa un objeto a una función, el "valor" es realmente una referencia a ese objeto, por lo que la función puede modificar las propiedades de ese objeto pero no hacer que la variable fuera de la función apunte a otro objeto .

Un ejemplo:

function changeParam(x, y, z) { x = 3; y = "new string"; z["key2"] = "new"; z["key3"] = "newer"; z = {"new" : "object"}; } var a = 1, b = "something", c = {"key1" : "whatever", "key2" : "original value"}; changeParam(a, b, c); // at this point a is still 1 // b is still "something" // c still points to the same object but its properties have been updated // so it is now {"key1" : "whatever", "key2" : "new", "key3" : "newer"} // c definitely doesn''t point to the new object created as the last line // of the function with z = ...


Mi entendimiento es que esto es en realidad muy simple:

  • Javascript siempre se pasa por valor, pero cuando una variable hace referencia a un objeto (incluidas las matrices), el "valor" es una referencia al objeto.
  • Cambiar el valor de una variable nunca cambia la primitiva u objeto subyacente, solo apunta la variable a una nueva primitiva u objeto.
  • Sin embargo, cambiar una propiedad de un objeto referenciado por una variable sí cambia el objeto subyacente.

Así que, para trabajar a través de algunos de sus ejemplos:

function f(a,b,c) { // Argument a is re-assigned to a new value. // The object or primitive referenced by the original a is unchanged. a = 3; // Calling b.push changes its properties - it adds // a new property b[b.length] with the value "foo". // So the object referenced by b has been changed. b.push("foo"); // The "first" property of argument c has been changed. // So the object referenced by c has been changed (unless c is a primitive) c.first = false; } var x = 4; var y = ["eeny", "miny", "mo"]; var z = {first: true}; f(x,y,z); console.log(x, y, z.first); // 4, ["eeny", "miny", "mo", "foo"], false

Ejemplo 2:

var a = ["1", "2", {foo:"bar"}]; var b = a[1]; // b is now "2"; var c = a[2]; // c now references {foo:"bar"} a[1] = "4"; // a is now ["1", "4", {foo:"bar"}]; b still has the value // it had at the time of assignment a[2] = "5"; // a is now ["1", "4", "5"]; c still has the value // it had at the time of assignment, i.e. a reference to // the object {foo:"bar"} console.log(b, c.foo); // "2" "bar"


Sí, Javascript siempre pasa por valor, pero en una matriz u objeto, el valor es una referencia a él, por lo que puede "cambiar" el contenido.

Pero, creo que ya lo has leído en SO; here tienes la documentación que deseas:

here