2016-05-05 4 views
1

Ich versuche, verschiedene Termine zu separaten task() - Objekte zuzuweisen; aber JavaScript verhält sich in diesem Fall unerwartet, wie aus der angehängten Ausgabe für das folgende Snippet ersichtlich ist.JavaScript - setDate überschreibt den Wert der zuvor zugewiesenen Variablen

Beim Zuweisen von Daten (dh Erwartete Ausgabe) gibt es beabsichtigte Werte zurück (dieselben, die zugewiesen werden), aber beim Anzeigen (dh Tatsächliche Ausgabe) überschreibt es den Wert für alle Datumsvariablen und gibt nur den letzten zugewiesenen Wert zurück alle von ihnen.

Bitte helfen Sie mir zu verstehen, wie das passiert!


 

 
    var task = function() { 
 
    this.name, this.date,this.id; 
 
    this.saveTask = function(n,d) 
 
    { 
 
    this.name = n; 
 
    this.date = d; 
 
    }; 
 
    this.gettask = function() 
 
    { 
 
    \t return this.id+": "+this.date; 
 
    }; 
 
} 
 

 
var d = new Date(); 
 
var obj = []; 
 
console.log("Expected Output"); 
 
for(i=0;i<5;i++){ 
 
\t obj[i] = new task(); 
 
    obj[i].id = i; 
 
    d.setDate(i); 
 
    obj[i].date = d; 
 
    console.log(i+": "+d); //Display assinged value 
 
} 
 

 
console.log("Actual Output"); 
 
for(i=0;i<5;i++){ 
 
\t console.log(obj[i].gettask()); 
 
}

OUTPUT IN KONSOLE

Expected Output 
0: Sat Apr 30 2016 10:42:20 GMT+0530 (India Standard Time) 
1: Fri Apr 01 2016 10:42:20 GMT+0530 (India Standard Time) 
2: Sat Apr 02 2016 10:42:20 GMT+0530 (India Standard Time) 
3: Sun Apr 03 2016 10:42:20 GMT+0530 (India Standard Time) 
4: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time) 
Actual Output 
0: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time) 
1: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time) 
2: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time) 
3: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time) 
4: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time) 
+0

Zustimmen! aber ich gebe das diffrent date jedes mal dem 'task.date' zu. – Sachink

+2

Nein, bist du nicht. 'var d = new Datum();' weist * d * ein Datum zu. 'obj [i] .date = d 'weist dem Datum eine ** Referenz ** zu, es wird nicht kopiert. ;-) – RobG

+0

Danke! Ich hab es geschafft! – Sachink

Antwort

2

Sie zu jedem task das gleiche Datum Objekt zuweisen. Erstellen Sie ein neues Datum für jeden in der Schleife.

for (let i = 0; i < 5; i++) { 
    let d = new Date(); 
    d.setDate(i); 

    let t = new task(); 
    t.date = d; 
    // etc 

    obj.push(t); 
} 

Ich schlage vor, Sie lesen dieses haben ~ Is JavaScript a pass-by-reference or pass-by-value language?


Beachten Sie, dass der Zeitanteil jedes Objekt Datum zu Ausführungszeit aufgrund unterschiedlich sein kann. Wenn Sie möchten, dass alle die gleiche Zeit, aber unterschiedliche Daten haben, müssen Sie eine kleine Änderung vornehmen.

+0

danke Ich wusste diese Lösung, aber ich kann nicht verstehen, warum das passiert; sogar ich gebe verschiedene Daten für jedes Objekt, aber es zeigt den gleichen Wert. – Sachink

+0

@Sachink sie sind nicht verschieden, sie sind die exakt gleiche 'Date' Instanz, durch Referenz zugewiesen. – Phil

+0

Verstanden! Das Datumsobjekt, das als Referenz zugewiesen wurde. Ich dachte, es macht eine Kopie, während es der Variablen zugewiesen wird. – Sachink

Verwandte Themen