Javascript 自定义迭代器返回空数组
为什么结果是空的Javascript 自定义迭代器返回空数组,javascript,ecmascript-6,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) {
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 = [];
似乎我还没有掌握迭代器的概念,或者我犯了一个愚蠢的错误。预期结果是[{dog:'buddy',hunger:true},{dog:'hasso':hunger:false}]
代码中有两个错误:
在您的此
函数中是迭代器,而不是下一个
的实例myDogs
既是迭代的关键,也是结果。这意味着在迭代结束时,dog
是从不dog
。您可能应该更加注意变量名的语义未定义的
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 };
}
};
};
};
但有一个更简单的解决方案:
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};
}
};
};
};
旁注:今天没有理由使用
void(0)
。而不是var dogHungryMap=[…myDogs]代码>,它可能应该是var dogHungryMap=[…dogs]代码>,对吗?