2016-07-06 142 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