【问题标题】:Why is my array being overwritten?为什么我的数组被覆盖?
【发布时间】:2016-07-06 15:27:08
【问题描述】:

我正在将 node.js 用于一个项目,并且我正在尝试将某些日期添加到数组中。但是,当我这样做时,它会用添加的当前日期覆盖整个数组。来源如下:

let startDate = new Date(2014, 0, 8, 19, 0, 0)
let endDate = new Date(2014, 0, 11, 19, 0, 0)
let datesToDownload = []
let datesInDB = [new Date(2014, 0, 8, 19, 0, 0), new Date(2014, 0, 9, 19, 0, 0), new Date(2014, 0, 10, 19, 0, 0), new Date(2014, 0, 8, 11, 0, 0)]

for (let i = startDate; i <= endDate; i.setDate(i.getDate() + 1)) {
  console.log('CHECKING DATE: ' + i.toDateString())

  if (!(datesInDB2.indexOf(i.toDateString()) >= 0)) {
    console.log('NEW RECORD FOUND FOR: ' + i.toDateString())
    datesToDownload.push(i)
    console.log('i: ' + i)

    for (let j in datesToDownload) {
      console.log('element ' + j + ': ' + datesToDownload[j])
    }
  }
}

输出如下:

CHECKING DATE: Wed Jan 08 2014
NEW RECORD FOUND FOR: Wed Jan 03 2014

i: Wed Jan 08 2016 20:00:00 GMT-0400 (Eastern Daylight Time)
element 0: Wed Jan 08 2016 20:00:00 GMT-0400 (Eastern Daylight Time)

CHECKING DATE: Thur Jan 09 2016
NEW RECORD FOUND FOR: Thur Jan 09 2016

i: Thur Jan 09 2016 20:00:00 GMT-0400 (Eastern Daylight Time)
element 0: Thur Jan 09 2016 20:00:00 GMT-0400 (Eastern Daylight Time)
element 1: Thur Jan 09 2016 20:00:00 GMT-0400 (Eastern Daylight Time)

CHECKING DATE: Fri Jan 10 2016
NEW RECORD FOUND FOR: Fri Jan 10 2016

i: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time)
element 0: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time)
element 1: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time)
element 2: Fri Jan 10 2016 20:00:00 GMT-0400 (Eastern Daylight Time)

......

请注意元素如何全部更改为当前插入的日期,尽管正在添加一个元素。

为什么会这样?如何预防?

【问题讨论】:

  • 所有插入的Date 对象实际上都是同一个对象,您只是在创建一个对不断修改的Date 对象的引用数组。

标签: javascript arrays node.js date element


【解决方案1】:

您在每次迭代时将完全相同的 Date 实例推送到数组中。但是,您可以创建它的副本

  datesToDownload.push(new Date(i));

【讨论】:

  • @Pointy 我明白了。这在其他语言中很常见,还是在 JavaScript 中特别存在?
  • @AmishJohn81 这会在其他一些语言中发生,是的。对象引用作为参数值而不是对象副本传递是很常见的。
【解决方案2】:

日期是一个对象,通过引用传递。在您的 for 循环中,您正在更改日期:

for (let i = startDate; i <= endDate; i.setDate(i.getDate() + 1)) {

【讨论】:

  • 这突然结束了。 很明显他正在更改 i 的值,这就是意图,但这并不能解释为什么最终结果到处都是一样的。
  • 是的,这是事实,但他肯定走在正确的道路上。
猜你喜欢
  • 2018-03-29
  • 2011-09-22
  • 1970-01-01
  • 2021-10-29
  • 2019-06-01
  • 1970-01-01
  • 2016-02-07
  • 2020-05-12
  • 1970-01-01
相关资源
最近更新 更多