javascript 添加每天的日期,打印出来后都是一样的,什么鬼,Date只能实例化一次吗

//给Date添加一个新的方法 (日期加一天)
Date.prototype.addDays=function(d){
    this.setDate(this.getDate() + d);
}
//给Date添加一个新的方法 (日期加一年)
Date.prototype.addYears = function(y) {
    var m = this.getMonth();
    this.setFullYear(this.getFullYear() + y);
    if (m < this.getMonth()) {
        this.setDate(0);
    }
};
var data=[];
var year=Math.ceil(1.2);
var nowDate=new Date();
var lastDate=new Date();
lastDate.addYears(1);
while(nowDate<lastDate){
    console.log(nowDate);
    data.push(nowDate);
    nowDate.addDays(1);
}
console.log(data);

这是打印的值


只是data数组的打印值

最后在网上找到的答案是 data.push(nowDate)改成data.push(new Date(nowDate));
这是为什么啊,求大神解惑

阅读 4.3k
6 个回答

data是一个数组,在data中,存放的是同一个对象:nowDate。
简单理解,就是你先在北京故宫买了一栋房子((~ o ~)~zZ 不要在意买不买得到。。。),
进入北京故宫的有10条街道,每条街道都有一个牌子,写着你买的房子的门牌号,这样,
别人找你就通过街道前的门牌号去找。
突然有一天,你把房子卖了,去国外买别墅了,可惜没通知别人,别人通过门牌号,找到的是
新的房主了,不是你了。
同样,data就是一个容器,下标就是街道口的指示,现在你把data所有的下标,就指向了nowDate,
最后又把nowDate换成了2017年,这样通过data去找到的nowDate,肯定都是最后一位主人了。
为什么把data.push(nowDate)改成data.push(new Date(nowDate))就行呢,因为这样做,就不是在街道口写下你的门牌号,而是把你当时房子的资料,放在指示牌上,别人找你,找到的是写指示牌时,你住的房子。

while循环中始终push的是同一个对象, 你希望同一个对象,在最终输出的时候显示不同的值么?

整个代码中实例化newData只执行了一次,while循环中永远都是同一个实例

新手上路,请多包涵

说白了,你push进数组的是同一个对象,每次改变,当然每项都变成新值。

新手上路,请多包涵

首先,因为push的是同一个对象的引用,所以数组里所有元素都是同步变化的。
至于为什么是17年。。。题主你有好好看下退出循环的条件么。。。

都不看图的吗,确实是每次都push了同一个对象, 你倒是说一下 为什么 data里的数据会变成17年的呢, 按照你们的思路,不是因该是当前时间吗

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题