我想了解Ecmascript 6迭代器,并试图创建一个行为非常像本地数组的数据结构。了解实现自定义迭代器
for (let i of [1,2,3]) console.log(i); //Iterate over data set itself
将输出1,2,3
for (let i of [1,2,3].keys()) console.log(i); //Iterate over a custom iterator from a method
将输出0,1,2
,和
var a = [1,2,3];
var keys = [...a.keys()];
将包含[0,1,2]
如预期。
因此,
console.log([1,2,3].keys().next());
将输出Object {value: 0, done: false}
现在,我创建了一个新的数据类型,并试图使其行为方式相同。
var myDogs = function(dogs) {
this.dogs = dogs;
this[Symbol.iterator] =() => {
let i = -1;
return {
next() {
i++;
var dog = Object.keys(dogs)[i];
if (!dog) return {done:true};
return {value:{ dog, hungry:dogs[dog] }, done:false};
}
};
};
this.dogsNames =() => {
return {
[Symbol.iterator]() {
let i = -1;
return {
next() {
i++;
var dog = Object.keys(dogs)[i];
if (!dog) return {done:true};
return {value: dog, done:false};
}
};
}
}
}
};
var dogs = new myDogs({ buddy: true, hasso: false });
可正常工作(自定义迭代器 - thank you):
var dogHungryMap = [...dogs];
dogHungryMap == [{ dog: 'buddy', hungry: true }, { dog: 'hasso': hungry: false }]
dogsNames()
工作几乎如预期的迭代器。这是OK:
var names = [...dogs.dogsNames()];
names == ["buddy", "hasso"]
但这并不:
dogs.dogsNames().next()
VM19728:2 Uncaught TypeError: dogs.dogsNames(...).next is not a function(…)
为什么,我怎么能重现本地阵列的行为?
仅供参考,本地阵列工作方式相同。没有'Array.prototype.next()'方法,它只能通过'arrayVar [Symbol.iterator]()获得。next()'too – CodingIntrigue
'dogNames'必须返回一个也是可迭代的迭代器(并返回它自己)。每个内置的迭代器都会这样做:http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%iteratorprototype%-object。快速测试:v'ar it = [] .keys();它[Symbol.iterator]()===它的结果是'true'。所以基本上:'return {next(){...},[Symbol.iterator](){return this; }};'。 –
@FelixKling这确实回答了我的问题。谢谢。 –