Quando gli array vengono assegnati a un'altra variabile, il riferimento viene passato al contrario dei valori. Ciò è confermato quando si confrontano due array utilizzando ==
operatore e restituisce true
Cosa mi manca con la comprensione degli array?
var a = [[1,2],[3,4],[5,6]];
var b = a; // b = [[1,2],[3,4],[5,6]]
var c = [].concat(a); // c = [[1,2],[3,4],[5,6]]
a == b; //true
a == c; //false
Con gli ingressi di cui sopra, quando modifico l'array b
, si muta matrice a
, ma non c
.
b.push([7,8]); // b = [[1,2],[3,4],[5,6], [7,8]]
a; //a = [[1,2],[3,4],[5,6], [7,8]]
c; //c = [[1,2],[3,4],[5,6]]
Ma quando faccio il seguito, si muta c
.
b[0].push(5); // b = [[1,2,5],[3,4],[5,6], [7,8]]
a; //a = [[1,2,5],[3,4],[5,6], [7,8]]
c; //c = [[1,2,5],[3,4],[5,6]]
Perché ciò accade? Questo comportamento si verifica con l'utilizzo di metodi array che muta l'array.
+1, questa è la risposta. Pensi che sarebbe una buona idea includere come eseguire * deep * la copia di un array (o qualsiasi altro oggetto)? (jQuery '.extend()' o lodash '.deepClone()'?) – bardzusny
@bardzusny ci sono già molte risposte su StackOverflow. – Leo
grazie nnnnnn, questo spiega il comportamento. Come ha aggiunto @bardzusny, qualcuno potrebbe suggerire qualche metodo o libreria incorporato che faccia una copia profonda degli array? – Harish