2016-08-11 5 views
0

von js Konvention und soweit ich weiß,Javascript Array seltsames Verhalten

  • Primitive Datentypen werden unter Pässen von Wert gearbeitet und
  • komplexe Datentypen werden unter Pass von Referenz arbeiten

Wenn es so ist

var ary = [1,2,3]; 
var dupAry = ary; 
//Now I am going to rewrite the ary variable as follows 
ary = [3,4,5]; 

Jetzt logge ich die Werte von ary und dupAry protokolliert es verschiedene Werte. Nach seinem Standard sollten beide Arrays die Werte zurückgeben.

  1. warum also verschiedene Array-Werte zurückgeben?

Ein weiteres Szenario

var ary = [1,2,3]; 
    var dupAry = ary; 
    //No I gonna apply splice method to the ary. 
    ary.splice(0,1); 

Nun sind beide Array gleichen Werte zurückgeben und es funktioniert mit Standard in Ordnung.

  1. Schließlich warum es nicht mit dem ersten Szenario angewendet?
+0

http: // Stapelüberlauf.com/questions/6612385/why-do-changed-a-array-in-javascript-affekoks-of-the-array – Tuhin

+0

Wenn Sie 'ary = [3,4,5];' definieren, weisen Sie ein neues Array zu zu verstoßen und die Überweisung zwischen "ary" und "dupAry" zu brechen – Redu

Antwort

3
var dupAry = ary; 

Dieser weist einen Verweis auf das Feld, dass ary Punkte zu dupAry. Sowohl ary als auch dupAry enthalten jetzt eine Referenz, die auf das gleiche Array-Objekt zeigt. Wenn Sie nun ary etwas anderes zuweisen, wird dupAry weiterhin einen Verweis enthalten, der auf das Array-Objekt zeigt, und ary wird jetzt einen anderen Wert enthalten.

Indem Sie einer Variablen etwas zuweisen, ändern Sie nicht das Objekt, das diese Variable bereits enthält. Sie ändern die Objektreferenz, die diese Variable enthält.

ary.splice(0,1) 

Dies modifiziert das eigentliche Objekt, dass beiden Variablen Punkte auf, so dass sowohl die Änderung zu sehen.

1

Wenn Sie dies tun:

ary = [3,4,5]; 

... Sie sind ein Array nicht ändern: Sie können die vorherige Referenz zerstören und eine brandneue variable * mit einem brandneuen Array erstellen. Sehen Sie den Unterschied mit:

ary.push(99); 

(*) Na ja, nicht wirklich eine neue Variable, natürlich, ich wusste nicht, wie es zu Wort.