javascription - Javascript per riferimento vs. per valore




windows document javascript (3)

  1. Tipo primitivo variabile come stringa, il numero viene sempre passato come valore per valore.
  2. Array e Object vengono passati come pass per riferimento o come valore in base a queste due condizioni.

    • se stai cambiando il valore di quell'oggetto o matrice con un nuovo oggetto o matrice, allora passa per valore.

      object1 = {item: "car"}; array1=[1,2,3];

    qui si assegna un nuovo oggetto o array a quello vecchio. Non si sta cambiando il valore della proprietà del vecchio oggetto. Quindi è passato per valore.

    • se si modifica un valore di una proprietà di un oggetto o di un array, questo viene passato per riferimento.

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

    qui stai modificando un valore di proprietà del vecchio oggetto. Non stai assegnando un nuovo oggetto o array a quello vecchio. Così è passato per riferimento.

Codice

    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

Questa domanda ha già una risposta qui:

Sto cercando un buon materiale di lettura completo su quando Javascript passa qualcosa in base al valore e quando per riferimento e quando la modifica di un elemento passato influisce sul valore esterno a una funzione e quando no. Mi interessa anche quando assegnare a un'altra variabile è per riferimento e per valore e se segue o meno regole diverse dal passare come parametro di funzione.

Ho fatto molte ricerche e ho trovato molti esempi specifici (molti di questi qui su SO) da cui posso iniziare a mettere insieme pezzi di regole reali, ma non ho ancora trovato un singolo documento ben scritto che descrive tutto.

Inoltre, ci sono modi nella lingua per controllare se qualcosa è passato per riferimento o per valore?

Ecco alcuni dei tipi di domande che voglio capire. Questi sono solo esempi: in realtà sto cercando di capire le regole in cui passa la lingua, non solo le risposte a esempi specifici. Ma ecco alcuni esempi:

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);

Quando i contenuti di x, yez sono cambiati fuori dall'ambito di f per tutti i diversi tipi?

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?
}

Se voglio fare una copia completamente indipendente di un oggetto (senza riferimenti di sorta), qual è il modo migliore per farlo?


Javascript passa sempre di valore. Tuttavia, se si passa un oggetto a una funzione, il "valore" è in realtà un riferimento a tale oggetto, pertanto la funzione può modificare le proprietà di quell'oggetto ma non causare la variabile all'esterno della funzione in modo che punti ad altri oggetti .

Un esempio:

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 = ...

Sì, Javascript passa sempre in base al valore, ma in un array o in un oggetto, il valore è un riferimento ad esso, quindi puoi "modificare" il contenuto.

Ma, penso che tu lo abbia già letto su SO; here hai la documentazione che desideri:

here





pass-by-value