代码之家  ›  专栏  ›  技术社区  ›  Mario

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

  •  1
  • Mario  · 技术社区  · 7 年前

    日期范围很广的

    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}
        }
    }
    

    以及从iterable对象创建一个新的数组实例

    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 ]
    

    在上使用forEach进行迭代 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
    

    但是迭代iterable对象会得到预期的结果

    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 回复  |  直到 5 年前
        1
  •  3
  •   flx    7 年前

    您正在创建数组索引 通过引用 而不是 按价值 .

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

    For more information about by reference/value