有人可以告诉我为什么这个操作会改变原始数组的值吗?
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的一个令人惊讶的功能。
答案 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])
,然后您可以在此处修改它而无需修改原始日期对象。