2015-05-30 11 views
8

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

risposta

14

.concat() fa una copia superficiale. Così dopo la riga:

var c = [].concat(a); 

c e a riferimento array differenti, ma c[0] e b[0] e a[0] tutti riferimento allo stesso array.

Citando MDN:

copie concat oggetto riferimenti nel nuovo array. Sia l'originale che il nuovo array si riferiscono allo stesso oggetto. Cioè, se un oggetto referenziato viene modificato, le modifiche sono visibili sia per gli array nuovi che per quelli originali.

+0

+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

+1

@bardzusny ci sono già molte risposte su StackOverflow. – Leo

+0

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

Problemi correlati