2012-05-16 12 views
5

http://jsfiddle.net/gfuKS/5/JavaScript-Array-Objekte

var transitionInitial = {property: "none"}; 
var rules = ["color", "background-color"]; 
var transitions = []; 
for (var k = 0; k < rules.length; k++) 
{ 
    transitions[k] = transitionInitial; 
    transitions[k].property = rules[k]; 
    alert(transitions[0].property); 
}​ 

Warum bei der zweiten Iteration Übergänge [0] .property gleich "background-color"?

Antwort

10

Da Sie einen Verweis auf transitionInitial speichern, keine Kopie davon. transitionInitial zeigt auf ein Objekt im Speicher, und Sie speichern einen Verweis auf dieses Objekt in transitions[k]. Unabhängig von der Iteration, in der Sie sich befinden, ändern Sie immer dasselbe Objekt.

0

Hat es irgendwas damit zu tun? for (var k = 0; k < rules.length; k++) Versuchen Sie, den Timer zu ändern.

3

Es liegt daran, dass beide Werte in Ihrem Array transitions auf das gleiche Objekt zeigen. Während der Ausführung Ihres Codes erzeugen Sie ein Objekt mit drei verschiedenen Referenzen (transitionInitial, transistions[0], & transistions[1]).

Während der ersten Iteration der Schleife wird transistions[0] auf das Objekt transitionInitial verwiesen. Dann wird die property Eigenschaft dieses Objekts auf den Wert "color" festgelegt. Während der zweiten Iteration wird transitions[1] auf das gleiche Objekt wie transitionInitial und transitions[0] festgelegt. Dann setzen Sie den Wert property auf "background-color" zurück.

Um dies zu lösen für jedes Ihrer Array-Indizes verschiedene Objekte erstellen:

// Not needed anymore: 
// var transitionInitial = {property: "none"}; 
var rules = ["color", "background-color"]; 
var transitions = []; 
for (var k = 0; k < rules.length; k++) { 
    transitions[k] = {}; 
    transitions[k].property = rules[k]; 
    alert(transitions[0].property); 
}​