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

정확히 반복 할 때마다 정확히 같은 날짜 인스턴스를 배열로 밀고 있습니다. 당신은 그러나 그것의 사본을 만들 수 있습니다

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

@Pointy 알겠습니다. 다른 언어에서 이것이 일반적인가요? 아니면 특히 자바 스크립트에서 문제입니까? – AmishJohn81

+2

@ AmishJohn81 이것은 다른 언어에서도 발생할 수 있습니다. 오브젝트 참조가 매개 변수 값으로 오브젝트 사본이 아닌 전달되는 것이 일반적입니다. – Pointy

2

날짜는 객체이며, 참조에 의해 전달된다. for 루프에서 당신은 날짜를 변경하고 있습니다 :

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

갑자기 끝났습니다. 그는'i'의 가치를 바꾸고 있습니다. 그것은 의도였습니다. 그러나 이것은 왜 최종 결과가 모든 곳에서 같은지에 대해 아무것도 설명하지 못합니다. – somethinghere

+0

네, 그렇습니다.하지만 그는 올바른 길을 가고있었습니다. – AmishJohn81