在JavaScript中复制数组变量?

时间:2012-10-08 15:37:03

标签: javascript

有人可以告诉我为什么这个操作会改变原始数组的值吗?

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]的副本...我是否需要使用克隆方法as described here

这是...... JavaScript的一个令人惊讶的功能。

3 个答案:

答案 0 :(得分:3)

如果您认为您的数组包含对象引用,那就不足为奇了。正如MDN docs的这一部分所述:

  

对于对象引用(而不是实际对象),slice将对象引用复制到新数组中。原始数组和新数组都引用相同的对象。如果引用的对象发生更改,则更改对新的和原始数组都可见。

答案 1 :(得分: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);

答案 2 :(得分:1)

使用slice时,您可以创建副本,从而创建新数组,而无需修改原始数据。但是内部元素不会被复制/克隆,除非它们是原始类型(bool,string,number)。由于你有一个Date对象,所以会创建一个新的数组,但是对你的日期对象的相同引用将被“复制”。因此,如果您想拥有一个新的日期对象,请执行new Date(oldDate) / var one_year_after_end=new Date(max_x_domain.slice(0)[0]),然后您可以在此处修改它而无需修改原始日期对象。