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

Javascript 调用[Symbol.iterator]()时未生成对象,javascript,ecmascript-6,iterator,iterable,Javascript,Ecmascript 6,Iterator,Iterable,以下是源代码: 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'

以下是源代码:

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}

但它正在打印<代码>{“值”:[“姓名”、“身高”、“体重”],“完成”:false}。如何解决这个问题

一次生成所有密钥。表示您的第一个
下一个
完成所有工作。您所需要的就是迭代这些键,并按顺序生成它们

const james={
姓名:“詹姆斯”,
高度:`5'10`,
体重:185,
[符号.迭代器]:函数*(){
for(让Object.keys的键(this)){
产生{propValue:this[key],propName:key};
}       
}
};
常量迭代器=james[Symbol.iterator]();
log(iterator.next());
log(iterator.next());

console.log(iterator.next());
您可以一次生成所有键。这意味着您的第一个
下一个
可以完成所有工作。您只需对键进行迭代并按顺序生成它们

const james={
姓名:“詹姆斯”,
高度:`5'10`,
体重:185,
[符号.迭代器]:函数*(){
for(让Object.keys的键(this)){
产生{propValue:this[key],propName:key};
}       
}
};
常量迭代器=james[Symbol.iterator]();
log(iterator.next());
log(iterator.next());

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);

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

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);

它正在打印值并完成。它还应该打印关键部分。生成器返回值的语法是
{value,done}
。您可以在该值处创建一个具有属性值和名称的对象。我已经更新了正在打印的值和完成。它还应该打印关键部分。生成器返回值的语法是
{value,done}
。您可以在该值处创建一个具有属性值和名称的对象。我已经更新了迭代结果中的
键从何而来
Object.keys
生成数组
[“name”,“height”,“weight”]
而不生成其他内容。迭代结果中的
键从何而来
Object.keys
生成数组
[“名称”、“高度”、“重量”]
而不生成其他内容。