Javascript日期以两种不同的方式运行
我有一个Vue js前端,其中我有以下while循环: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(
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)。