2015-07-21 112 views
0

我在写一个简单的javascript函数,但并不像我预期的那样。是Javascript array.push方法同步吗?

以下是代码:

var startDate = new Date('2015-07-01 00:00 +0800'); 
    var endDate = new Date('2015-07-10 00:00 +0800'); 
    var arrayOfDates = []; 

    if (endDate >= startDate) { 
     while (startDate < endDate) { 
      arrayOfDates.push(startDate); 
      startDate = new Date(startDate.setDate(startDate.getDate() + 1)); 
     } 
    } 

虽然我期待的arrayOfDates的结果是[2015-07-01, 2015-07-02, 2015-07-03.... , 2015-07-10']。结果是[2015-07-02, 2015-07-03.... , 2015-07-10']

这是为什么?在变量被推送到数组之前,不知何故var startDate被更新?如果是这种情况,我如何确保代码同步运行?

+0

似乎是工作的罚款https://开头jsfiddle.net/pjso2t2w/ – AmmarCSE

+0

我得到7月1日 - 7月9日包括在内。 http://jsfiddle.net/j08691/7z65chkb/ – j08691

+2

该时间格式不被Firefox理解。 – Pointy

回答

4

当你拨打setDate(),那变更的日期。 Date原型上的所有setter函数都会改变日期实例。

您必须创建一个新的日期实例,然后再调用setter来更改它。

 startDate = new Date(startDate); 
     startDate.setDate(startDate().getDate() + 1); 
1

它会为你做的工作,它不会改变你的日期,直到你的当前日期推:

var startDate = new Date('2015-07-01 00:00'); 
    var endDate = new Date('2015-07-10 00:00'); 
    var arrayOfDates = []; 

    if (endDate >= startDate) { 
     for(var dt = startDate; startDate < endDate; dt = new Date(startDate.setDate(startDate.getDate() + 1))){ 
      console.log(startDate); 
      arrayOfDates.push(startDate); 
     } 
    } 

这里有小提琴https://jsfiddle.net/ggqzbn6h/

+0

这将与OP中的代码具有完全相同的问题。 – Pointy