2016-07-06 197 views
1

我正在使用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]) 
    } 
    } 
} 

和输出是这样的:

CHECKING DATE: Wed Jan 08 2014 
NEW RECORD FOUND FOR: Wed Jan 03 2014 

i: Wed Jan 08 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 
element 0: Wed Jan 08 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 

CHECKING DATE: Thur Jan 09 2016 
NEW RECORD FOUND FOR: Thur Jan 09 2016 

i: Thur Jan 09 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 
element 0: Thur Jan 09 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 
element 1: Thur Jan 09 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 

CHECKING DATE: Fri Jan 10 2016 
NEW RECORD FOUND FOR: Fri Jan 10 2016 

i: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 
element 0: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 
element 1: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 
element 2: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time) 

...... 

注意如何元素都更改为当前日期插入,虽然添加的元素。

这是怎么发生的?我怎样才能防止它?

+2

所有插入'Date'对象实际上是同一个对象,你刚刚创建引用数组的'那不断得到修改Date'对象。 – somethinghere

回答

5

您在每次迭代中将完全相同的Date实例推入数组中。您可以创建一个副本然而它:

datesToDownload.push(new Date(i)); 
+0

@我明白了。这在其他语言中很常见,或者这在JavaScript中是一个特别的问题? – AmishJohn81

+2

@ AmishJohn81这会发生在其他一些语言,是的。将对象引用作为参数值而不是对象副本传递很常见。 – Pointy

2

一个日期是一个对象,并通过引用传递。在你的循环要更改日期:

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

突然结束。显而易见,他正在改变'我'的价值,这就是意图,但是这并没有解释为什么最终的结果在任何地方都是一样的。 – somethinghere

+0

是的,这是事实,但他肯定是在正确的道路上。 – AmishJohn81