在JavaScriptES6中,每次调用obj[Symbol.iterator]函数时,iterable是否会吐出一个新的迭代器?

在JavaScriptES6中,每次调用obj[Symbol.iterator]函数时,iterable是否会吐出一个新的迭代器?,javascript,ecmascript-6,Javascript,Ecmascript 6,我的想法是,如果obj是一个iterable,那么每次调用obj[Symbol.iterator]函数时,它都会抛出一个全新的迭代器。现在,aMap.entries() map=newmap([[“a”,3],“b”,“hi'],[“c”,true]]); for(map.entries()的常数){ 控制台日志(e); } for(map.entries()的常数){ 控制台日志(e); } const someEntries=map.entries(); log(someEntries.n

我的想法是,如果
obj
是一个iterable,那么每次调用
obj[Symbol.iterator]
函数时,它都会抛出一个全新的迭代器。现在,
aMap.entries()

map=newmap([[“a”,3],“b”,“hi'],[“c”,true]]);
for(map.entries()的常数){
控制台日志(e);
}
for(map.entries()的常数){
控制台日志(e);
}
const someEntries=map.entries();
log(someEntries.next());
log(someEntries[Symbol.iterator]);
log(someEntries[Symbol.iterator]().next());
log(someEntries[Symbol.iterator]().next());
log(someEntries[Symbol.iterator]().next());

log(someEntries[Symbol.iterator]().next())
您最初的看法是,iterable的
@@iterator
方法每次调用时都应该生成一个新的迭代器,是正确的

你被另一种现象弄糊涂了

当您调用映射的
@@iterator
方法(或
map#entries
,两者的作用相同)时,您会得到一个全新的迭代器,您可以显式使用它


如果在映射上使用
for..of
,它将在内部调用
@@iterator
方法,并执行相同的操作

map=newmap([[“a”,3],“b”,“hi'],[“c”,true]]);
//这将使用@迭代器:
用于(地图常数){
控制台日志(e);
}
//或者手动执行相同操作:
const someEntries=map.entries();
log(someEntries.next().value);
log(someEntries.next().value);
log(someEntries.next().value)
那是什么意思?没有保证

对。大多数iterables都会创建一个新的迭代器对象,但不是所有的迭代器对象。迭代器本身通常是可编辑的(这样您就可以编写
const-entriesIter=map.entries();for(const-e-of-entriesIter)…
),而这些迭代器通常每次都返回相同的迭代器本身:
entriesIter[Symbol.iterator]()==entriesIter


但是,
map.entries()
map[Symbol.iterator]()
arr[Symbol.iterator]()
确实返回新的迭代器。

这里的问题是迭代器本身是可迭代的。但是迭代器的iterable是迭代器本身。。。当您想使用“可以迭代的东西”,但不想定义它是迭代器还是iterable时,这有点方便。它们被称为“iterable迭代器”。我希望我没有达到。如果您在
某些条目上使用
for..of
,则不能再这样做。您可以使用
map.entries()
执行此操作,因为它返回一个新的迭代器对象。@VLAZ您是说同样是iterable的迭代器有一个名称:“iterable iterator”,而这些“iterable iterator”通常会自动吐出,而不是吐出一个新的迭代器?如果是这样的话,那么JSES6文档可能会更清楚地指定它:iterator是iterator,iterable是iterable,但还有第三种类型:iterable iterable iterable我不确定它是否是“正式名称”,但它非常常见。它是自描述性的——iterable有一个
符号。迭代器
方法;迭代器有一个
next
方法。Iterable迭代器同时具有
符号、迭代器
方法和
下一个
方法,因此它满足了这两种方法的要求。碰巧的是,这个特殊的iterable(
.entries()
的默认实现)将自身作为迭代器返回。我想让它回到手头的问题上来——不能保证iterable总是会生成一个不同的迭代器。没有什么需要这样做。每次返回相同迭代器的iterable,迭代器可以耗尽一次,直到永远,直到永远仍然有效。