迭代日期的可迭代对象时结果不正确
Incorrect result when iterating over an iterable object of dates
具有可迭代的日期范围
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 ]
在 dateList
上使用 forEach 进行迭代也会给出错误的结果
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 ]
这让我假设我增加日期的方式产生了这个结果,如果是这样,我有什么选择?再次感谢
能否请您解释一下错误的原因?非常感谢。
您正在创建数组索引通过引用而不是通过值。
这意味着您的数组基本上是一个 "pointers" 链,其中它们都是对同一对象的相等引用(感谢@rock star)。
For more information about by reference/value
具有可迭代的日期范围
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 ]
在 dateList
上使用 forEach 进行迭代也会给出错误的结果
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 ]
这让我假设我增加日期的方式产生了这个结果,如果是这样,我有什么选择?再次感谢
能否请您解释一下错误的原因?非常感谢。
您正在创建数组索引通过引用而不是通过值。
这意味着您的数组基本上是一个 "pointers" 链,其中它们都是对同一对象的相等引用(感谢@rock star)。
For more information about by reference/value