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],对吗?