Könnte mir bitte jemand sagen, warum diese Operation den Wert des ursprünglichen Arrays ändert?

var today = new Date(); 
var max_x_domain = [today];

var one_year_after_end = max_x_domain.slice(0)[0];
one_year_after_end.setYear(one_year_after_end.getFullYear() - 1);

console.log('array after operation', max_x_domain);

Und wie kann ich eine Kopie von max_x_domain[1] erstellen? Muss ich eine Klonmethode verwenden? wie hier beschrieben ?

Dies ist ... eine überraschende Funktion von JavaScript.

1
Richard 8 Okt. 2012 im 19:37

3 Antworten

Beste Antwort
var dateToCopy = new Date();

var newDate = new Date(dateToCopy);

Überarbeiteter Code

var today = new Date(); 
var max_x_domain = [today];

var one_year_after_end = new Date(max_x_domain.slice(0)[0]);
one_year_after_end.setYear(one_year_after_end.getFullYear() - 1);

console.log('array after operation', max_x_domain);
1
Alcides Queiroz Aguiar 8 Okt. 2012 im 15:39

Es ist überhaupt nicht überraschend, wenn Sie bedenken, dass Ihr Array Objektreferenzen enthält. In diesem Abschnitt des MDN docs heißt es:

Bei Objektreferenzen (und nicht beim eigentlichen Objekt) kopiert slice Objektreferenzen in das neue Array. Sowohl das ursprüngliche als auch das neue Array beziehen sich auf dasselbe Objekt. Wenn sich ein referenziertes Objekt ändert, sind die Änderungen sowohl für das neue als auch für das ursprüngliche Array sichtbar.

3
Anthony Grist 8 Okt. 2012 im 15:41

Wenn Sie slice verwenden, erstellen Sie eine Kopie und damit ein neues Array, ohne das Original zu ändern. Die darin enthaltenen Elemente werden jedoch nicht kopiert / geklont, es sei denn, sie sind primitiv (Bool, String, Nummer). Da Sie dort ein Datumsobjekt haben, wird ein neues Array erstellt, aber derselbe Verweis auf Ihr Datumsobjekt wird "kopiert". Wenn Sie also ein neues Datumsobjekt haben möchten, führen Sie new Date(oldDate) / var one_year_after_end=new Date(max_x_domain.slice(0)[0]) aus, und Sie können es von da an ändern, ohne das ursprüngliche Datumsobjekt zu ändern.

1
japrescott 8 Okt. 2012 im 15:43