Bar*_*ski 4 javascript ecmascript-6
为什么结果是空的?
var myDogs = function(dogs) {
this.dogs = dogs;
this[Symbol.iterator] = function() {
let i = -1;
return {
next() {
i++;
let j = 0;
var dog = void(0);
for (var dog in this.dogs) {
if (j == i) {
dog = { dog, hungry: dogs[dog] };
break;
}
j++;
}
var done = !dog;
return { value: dog, done };
}
};
};
};
var dogs = new myDogs({ buddy: true, hasso: false });
var dogHungryMap = [...dogs];
> dogHungryMap = [];
Run Code Online (Sandbox Code Playgroud)
好像我没有掌握迭代器的概念,或者我做了一个完全愚蠢的错误.预期的结果是[{ dog: 'buddy', hungry: true }, { dog: 'hasso': hungry: false }].
你的代码中有两个错误:
this在你的next函数中,是迭代器,而不是实例myDogs.
dog是你的迭代和结果的关键.这意味着dog是永远不会 undefined在迭代结束.你应该对变量名的语义更加小心.
解决这两个问题就是这样:
var myDogs = function(dogs) {
this.dogs = dogs;
let _this = this;
this[Symbol.iterator] = function() {
let i = -1;
return {
next() {
i++;
let j = 0;
var dog = void(0);
for (var dogName in _this.dogs) {
if (j == i) {
dog = { dog:dogName, hungry: _this.dogs[dogName] };
break;
}
j++;
}
var done = !dog;
return { value: dog, done };
}
};
};
};
Run Code Online (Sandbox Code Playgroud)
但是有一个更简单的解决方案:
var myDogs = function(dogs) {
this[Symbol.iterator] = function() {
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};
}
};
};
};
Run Code Online (Sandbox Code Playgroud)
旁注:void(0)今天没有理由使用.