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时创建一个副本并因此创建一个新数组,而不修改原始数组。但是里面的元素不会被复制/克隆,除非它们是原始类型(布尔、字符串、数字)。由于您在那里有一个日期对象,因此将创建一个新数组,但对您的日期对象的相同引用将被“复制”。因此,如果您想拥有一个新的日期对象,请执行new Date(oldDate)/var one_year_after_end=new Date(max_x_domain.slice(0)[0])并且您可以从那里修改它而无需修改原始日期对象。

于 2012-10-08T15:43:47.563 回答