Javascript日期以两种不同的方式运行

Javascript日期以两种不同的方式运行,javascript,datetime,vue.js,Javascript,Datetime,Vue.js,我有一个Vue js前端,其中我有以下while循环: while (this.day.getDay() != 0) { console.log(this.day) this.days.push(this.day) this.dates.push(this.day.toDateString()) this.day.setDate(this.day.getDate() + 1) } 循环在控制台中输出以下内容。 我将变量实例化为: day: new Date(Date.now(

我有一个Vue js前端,其中我有以下while循环:

while (this.day.getDay() != 0) {
  console.log(this.day)
  this.days.push(this.day)
  this.dates.push(this.day.toDateString())
  this.day.setDate(this.day.getDate() + 1)
}
循环在控制台中输出以下内容。

我将变量实例化为:

day: new Date(Date.now()),
dates: [],
days:[]

我想知道为什么dates数组工作正常,包含9月6日、9月7日和9月8日,而days数组只包含9月9日三次?同样奇怪的是,当我记录this.day时,它记录了正确的日期,但没有将其添加到days数组中。这是怎么回事?

执行这一行时:

this.days.push(this.day)
this.dates.push(this.day.toDateString())
每次都会不断推送相同的日期对象。您永远不会重新分配
this.day
,您只会使用
setDate
对其进行变异,每次这样做时,该数组中的所有引用都会更新

但当你运行这条线路时:

this.days.push(this.day)
this.dates.push(this.day.toDateString())
您正在捕获推送时的状态,字符串是不可变的

对于一个更简单的例子,你会得到什么,看看这个

const foo = {bar: 3};
const arr = [foo, foo, foo]; // all the same foo
arr.map(x => x.bar); // 3, 3, 3
foo.bar = 5;
arr.map(x => x.bar); // 5, 5, 5

执行此行时:

this.days.push(this.day)
this.dates.push(this.day.toDateString())
每次都会不断推送相同的日期对象。您永远不会重新分配
this.day
,您只会使用
setDate
对其进行变异,每次这样做时,该数组中的所有引用都会更新

但当你运行这条线路时:

this.days.push(this.day)
this.dates.push(this.day.toDateString())
您正在捕获推送时的状态,字符串是不可变的

对于一个更简单的例子,你会得到什么,看看这个

const foo = {bar: 3};
const arr = [foo, foo, foo]; // all the same foo
arr.map(x => x.bar); // 3, 3, 3
foo.bar = 5;
arr.map(x => x.bar); // 5, 5, 5

名称
day
令人困惑,因为它是一个
Date
,而不是日期中的一天。您正在推送对日期对象的引用,但日期字符串不会更改。可能是重复的,请让其他人使用agree@lealceldeiro我本来打算这样做。day.getDay()将日期添加到数组中。我决定添加date对象会更有用,因为它不起作用,所以还不必更改变量名。我理解这种担心。名称
day
令人困惑,因为它是一个
日期,而不是日期中的一天。您正在推送对日期对象的引用,但日期字符串不会更改。可能是重复的,让其他人来做吧agree@lealceldeiro我本来打算这样做。day.getDay()将日期添加到数组中。我决定添加date对象会更有用,因为它不起作用,所以还不必更改变量名。我很感激你的关心。这很有道理,因为我没有意识到这一点,我觉得自己很傻。解决这个问题的最好办法是像@epascarello发布的链接中所示,将新日期克隆到数组中吗?@Taylor是的,我会将其克隆掉,或者使用完全不同的方法(例如,不使用OO)。这很有道理,因为我没有意识到这一点,我感到很愚蠢。解决此问题的最佳方法是将新日期克隆到数组中,如@epascarello发布的链接所示吗?@Taylor是的,我会将其克隆掉,或者使用完全不同的方法(例如,不使用OO)。