Javascript 为什么我的数组被覆盖?

Javascript 为什么我的数组被覆盖?,javascript,arrays,node.js,date,element,Javascript,Arrays,Node.js,Date,Element,我正在为一个项目使用node.js,并试图将某些日期添加到数组中。但是,当我这样做时,它会用添加的当前日期覆盖整个数组。资料来源如下: let startDate = new Date(2014, 0, 8, 19, 0, 0) let endDate = new Date(2014, 0, 11, 19, 0, 0) let datesToDownload = [] let datesInDB = [new Date(2014, 0, 8, 19, 0, 0), new Date(2014,

我正在为一个项目使用node.js,并试图将某些日期添加到数组中。但是,当我这样做时,它会用添加的当前日期覆盖整个数组。资料来源如下:

let startDate = new Date(2014, 0, 8, 19, 0, 0)
let endDate = new Date(2014, 0, 11, 19, 0, 0)
let datesToDownload = []
let datesInDB = [new Date(2014, 0, 8, 19, 0, 0), new Date(2014, 0, 9, 19, 0, 0), new Date(2014, 0, 10, 19, 0, 0), new Date(2014, 0, 8, 11, 0, 0)]

for (let i = startDate; i <= endDate; i.setDate(i.getDate() + 1)) {
  console.log('CHECKING DATE: ' + i.toDateString())

  if (!(datesInDB2.indexOf(i.toDateString()) >= 0)) {
    console.log('NEW RECORD FOUND FOR: ' + i.toDateString())
    datesToDownload.push(i)
    console.log('i: ' + i)

    for (let j in datesToDownload) {
      console.log('element ' + j + ': ' + datesToDownload[j])
    }
  }
}
请注意,尽管添加了一个元素,但所有元素都更改为当前插入日期


为什么会这样?如何防止它?

在每次迭代中,您都将完全相同的日期实例推送到数组中。但是,您可以创建其副本:

  datesToDownload.push(new Date(i));

在每次迭代中,您将完全相同的日期实例推送到数组中。但是,您可以创建其副本:

  datesToDownload.push(new Date(i));

日期是一个对象,通过引用传递。在for循环中,您正在更改日期:

for (let i = startDate; i <= endDate; i.setDate(i.getDate() + 1)) {

for(让i=startDate;i日期是一个对象,通过引用传递。在for循环中,您正在更改日期:

for (let i = startDate; i <= endDate; i.setDate(i.getDate() + 1)) {

用于(设i=startDate;i所有插入的
Date
对象实际上都是同一个对象,您只是在创建一个不断修改的
Date
对象的引用数组。所有插入的
Date
对象实际上都是同一个对象,您只是在创建一个
Date
对象的引用数组。)t不断被修改。结果突然结束。很明显,他正在更改
i
的值,这是他的意图,但这并不能解释为什么最终结果在所有地方都是一样的。是的,这是真的,但他确实走上了正确的道路。结果突然结束。很明显,他正在更改
i
的值,这就是意图,但这并不能解释为什么最终结果在任何地方都是一样的。是的,这是真的,但他确实走上了正确的道路。@Pointy我明白了。这在其他语言中是常见的还是JavaScript中特别存在的问题?@AmishJohn81这在其他一些语言中会发生,是的。对象引用是非常常见的sed作为参数值而不是对象副本。@我明白了。这在其他语言中是常见的还是在JavaScript中特别存在问题?@AmishJohn81这在其他一些语言中会发生,是的。对象引用作为参数值而不是对象副本传递是很常见的。