目前我在网上课程中遇到了一个教训。
这是问题
//Implement an object named obj which has an Symbol.iterator property which iterates over every digit of the provided this.number.
const obj = {
number: 53820391,
[Symbol.iterator] () {
// TODO: implement me to print out all the digits of this.number
}
}
这就是我现在正在尝试的
const obj = {
number: 53820391,
[Symbol.iterator] () {
// TODO: implement me to print out all the digits of this.number
let cur = 0;
let a = this.number.toString();
let num = a.split();
return{
next() {
for( let char of num ){
return{
value: char,
done: cur++ > num.length
}
}
}
}
}
}
console.log(obj)
for(let char of obj){
char
}
我想知道我哪里出错了?以及解决这个问题的过程。
答案 0 :(得分:2)
这是我能想到的最简单的实现:
const obj = {
number: 53820391,
[Symbol.iterator]: function*() {
yield* this.number.toString();
}
}
或者,您可以将其实现为
for (let d of this.number.toString()) {
yield d;
}
您的代码有什么问题:next()
函数会创建一个新的上下文,因此this
引用新的上下文,而不是原始对象。
要解决此问题,您可以保留对const that = this;
等原始对象的引用,并在需要的地方使用that
引用。
参考文献:
答案 1 :(得分:1)
如果你想保留你所拥有的基本格式,这样就可以看到内部工作,你就非常接近了。你只是不希望next()
内的for循环。循环将由调用迭代器的人发生。所以这样的事情有效:
const obj = {
number: 53820391,
[Symbol.iterator]() {
const v = Array.from(this.number.toString())
return {
next: () => ({
done: v.length === 0,
value: v.shift()
})
}
}
}
for (const i of obj) {
console.log(i)
}