1

この操作によって元の配列の値が変更される理由を誰かに教えてもらえますか?

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);

そして、どうすればコピーを作成できますか...ここで説明されてmax_x_domain[1]いるクローンメソッドを使用する必要がありますか?

これは...JavaScriptの驚くべき機能です。

4

3 に答える 3

3

配列にオブジェクト参照が含まれていることを考えれば、まったく驚くことではありません。MDNドキュメントのこのセクションに記載されているように:

オブジェクト参照(実際のオブジェクトではない)の場合、sliceオブジェクト参照を新しい配列にコピーします。元の配列と新しい配列の両方が同じオブジェクトを参照しています。参照されるオブジェクトが変更された場合、その変更は新しい配列と元の配列の両方に表示されます。

于 2012-10-08T15:41:22.123 に答える
1
var dateToCopy = new Date();

var newDate = new Date(dateToCopy);

リファクタリングされたコード

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);
于 2012-10-08T15:39:38.797 に答える
1

使用するときsliceは、元の配列を変更せずに、コピーを作成して新しい配列を作成します。ただし、内部の要素は、プリミティブ型(bool、string、number)でない限り、コピー/複製されません。そこに日付オブジェクトがあるので、新しい配列が作成されますが、日付オブジェクトへの同じ参照が「コピー」されます。したがって、新しい日付オブジェクトが必要な場合は、new Date(oldDate)/var one_year_after_end=new Date(max_x_domain.slice(0)[0])を実行すると、元の日付オブジェクトを変更せずに、そこから変更できます。

于 2012-10-08T15:43:47.563 に答える