迭代日期的可迭代对象时的结果不正确

时间:2018-01-24 15:43:13

标签: javascript ecmascript-6

具有可迭代的日期范围

const dateRange = {
    from: new Date(2018, 0, 23),
    to: new Date(2018, 0, 28),
    [Symbol.iterator]() {
        this.current = this.from

        return this
    },
    next() {
        if (this.current <= this.to) {
            this.current.setDate(this.current.getDate() + 1)

            return {done: false, value: this.current}
        }

        return {done: true}
    }
}

从可迭代对象

创建一个新的Array实例
const dateList = Array.from(dateRange)

console.log(dateList)时我得到以下输出

[ 2018-01-29T06:00:00.000Z,
  2018-01-29T06:00:00.000Z,
  2018-01-29T06:00:00.000Z,
  2018-01-29T06:00:00.000Z,
  2018-01-29T06:00:00.000Z,
  2018-01-29T06:00:00.000Z ]

使用for {to dateList进行迭代也会得到错误的结果

dateList.forEach(date => {
    console.log(date)
})

2018-01-29T06:00:00.000Z
2018-01-29T06:00:00.000Z
2018-01-29T06:00:00.000Z
2018-01-29T06:00:00.000Z
2018-01-29T06:00:00.000Z
2018-01-29T06:00:00.000Z

但迭代迭代对象会给出例外结果

for (let date of dateRange) {
    console.log(date)
}

2018-01-24T06:00:00.000Z
2018-01-25T06:00:00.000Z
2018-01-26T06:00:00.000Z
2018-01-27T06:00:00.000Z
2018-01-28T06:00:00.000Z
2018-01-29T06:00:00.000Z

为了提供问题的背景

我从http://javascript.info/iterable获取下一个可迭代示例几乎是相同的示例。不同之处在于,在这种情况下,它是关于数字的

let range = {
  from: 1,
  to: 5
};

range[Symbol.iterator] = function() {
  return {
    current: this.from,
    last: this.to,
    next() {
      if (this.current <= this.last) {
        return { done: false, value: this.current++ };
      } else {
        return { done: true };
      }
    }
  };
};

console.log当我得到预期结果时

const numberList = Array.from(range)

console.log(numberList)

[ 1, 2, 3, 4, 5 ]

这让我觉得我增加日期的方式产生了这个结果,如果是这样,我有什么选择?再次感谢

您能解释一下错误的原因吗?非常感谢你。

1 个答案:

答案 0 :(得分:3)

您正在创建数组索引按引用而不是按值

这意味着你的数组基本上是一个“指针”链,它们只是对同一个对象的所有相等引用(感谢@rock star)。

For more information about by reference/value