【问题标题】:Fill an array with dates用日期填充数组
【发布时间】:2016-09-15 16:31:57
【问题描述】:

真的不明白为什么我推入数组的日期不是我在控制台中调用数组时出现的日期。即我希望数组中的第一个条目是今天的日期,这是从两个警报调用返回的,但是当我检查数组的第一个位置时,它有昨天的日期!?

function sevenDayPeriod(date) {

    for (var i = 0; i <=6; i++) {

        alert(date);    //check to see date is today's date
        dateRange[i] = date;
        alert(dateRange[i]);    //confirm that what I've pushed to array is today's date

        date = date.setDate(date.getDate() - 1);
        date = new Date(date);
    }
};

var dateRange = [];
var today  = new Date();

sevenDayPeriod(today);

谢谢

【问题讨论】:

    标签: javascript arrays byref


    【解决方案1】:
    ...
    dateRange[i] = date;
    alert(dateRange[i]);    //confirm that what I've pushed to array is today's date
    date = date.setDate(date.getDate() - 1);
    ...
    

    在上面的第一行中,您将第 i 个数组元素设置为 date(参考),然后显示它,然后使用 setDate 更改同一个对象,这会导致您的问题,作为数组元素仍然指向修改后的对象。
    你可以解决这个问题,例如与另一个像这样的 var

    ...
    var prevDay = new Date();
    prevDay.setDate(date.getDate() - 1);
    date = prevDay;
    ...  
    

    或在将其推入数组之前创建它的副本

    【讨论】:

    • 感谢您的解释。很有道理,希望我能从中学到一些东西!
    【解决方案2】:

    function sevenDayPeriod(date) {
        for (var i = 0; i <=6; i++) {
    	//date object is as a "pointer", you have to clone it
    	var copiedDate = new Date(date);
    		
            //alert(date); //check to see date is today's date
            dateRange[i] = copiedDate;
            //alert(dateRange[i]); //confirm that what I've pushed to array is today's date
    		
            date = date.setDate(date.getDate() - 1);
            date = new Date(date);
        }
    };
    
    var dateRange = [];
    var today  = new Date();
    
    sevenDayPeriod(today);
    
    console.log(dateRange);

    当您修改日期时,您也在更改推送日期。你必须克隆它。

    【讨论】:

      猜你喜欢
      • 2021-02-05
      • 2019-05-19
      • 1970-01-01
      • 2019-07-22
      • 2012-09-17
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多