Bar*_*ski 4 javascript ecmascript-6
我试图理解Ecmascript 6迭代器并尝试创建一个与本机阵列非常相似的数据结构.
for (let i of [1,2,3]) console.log(i); //Iterate over data set itself
Run Code Online (Sandbox Code Playgroud)
将输出 1,2,3
for (let i of [1,2,3].keys()) console.log(i); //Iterate over a custom iterator from a method
Run Code Online (Sandbox Code Playgroud)
将输出0,1,2,和
var a = [1,2,3];
var keys = [...a.keys()];
Run Code Online (Sandbox Code Playgroud)
将按[0,1,2]预期包含.
因此,
console.log([1,2,3].keys().next());
Run Code Online (Sandbox Code Playgroud)
将输出 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 });
Run Code Online (Sandbox Code Playgroud)
这按预期工作(自定义迭代器 - 谢谢):
var dogHungryMap = [...dogs];
dogHungryMap == [{ dog: 'buddy', hungry: true }, { dog: 'hasso': hungry: false }]
Run Code Online (Sandbox Code Playgroud)
迭代器dogsNames()的工作原理几乎如预期.还行吧:
var names = [...dogs.dogsNames()];
names == ["buddy", "hasso"]
Run Code Online (Sandbox Code Playgroud)
但这不是:
dogs.dogsNames().next()
VM19728:2 Uncaught TypeError: dogs.dogsNames(...).next is not a function(…)
Run Code Online (Sandbox Code Playgroud)
为什么以及如何重现本机数组的行为?
因为dogsNames()返回一个具有迭代器作为键的对象.所以你可以使用for...ofdogNames,但要next()直接访问你需要访问在对象上声明的迭代器函数,如下所示:
dogsNames()[Symbol.iterator]().next()
Run Code Online (Sandbox Code Playgroud)
为了完整性,共享next()函数的完整代码:
var myDogs = function(dogs) {
this.dogs = dogs;
let i = -1;
var iter = {
next() {
i++;
var dog = Object.keys(dogs)[i];
if (!dog) return {done:true};
return {value:{ dog, hungry:dogs[dog] }, done:false};
}
}
this[Symbol.iterator] = () => iter;
this.next = iter.next;
};
var dogList = new myDogs({
dog1: "no",
dog2: "yes"
});
for(const x of dogList) console.log(x);
console.log(dogList.next());
console.log(dogList.next());
Run Code Online (Sandbox Code Playgroud)