调用 [Symbol.iterator]() 时未生成对象

Object is not being produced on calling [Symbol.iterator]()

这是这个源代码:

const james = {
    name: 'James',
    height: `5'10"`,
    weight: 185,
    [Symbol.iterator]:function*(){
    yield Object.keys(this) ;   
    }
};
const iterator = james[Symbol.iterator]();
//
console.log(iterator.next().value); // 'James'
console.log(iterator.next().value); // `5'10`
console.log(iterator.next().value); // 185

第一次调用 iterator.next().value 应该打印

{"value":"James","key":"name","done":false}

但正在打印 {"value":["name","height","weight"],"done":false}。如何解决这个问题?

您一次 yield 所有键。意味着您的第一个 next 完成所有工作。您所需要做的就是遍历键并按顺序 yield 它们。

const james = {
    name: 'James',
    height: `5'10"`,
    weight: 185,
    [Symbol.iterator]:function*(){   
       for(let key of Object.keys(this)) {
          yield  { propValue: this[key], propName: key};       
       }       
    }
};

const iterator = james[Symbol.iterator]();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

实际上,这将是您正在寻找的解决方案,它输出的正是您需要输出的内容。

const james = {
  name: 'James',
  height: `5'10"`,
  weight: 185,
  [Symbol.iterator]: function() {
    let keys = Object.keys(this), index = 0;
    return {
      next: () => { 
        return {
          key: keys[index], value: this[keys[index]], done: ++index >= keys.length 
        };  
      }
    }
  }
}

const iterator = james[Symbol.iterator]();

console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);