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.
3 Antworten
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);
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.
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.