Sam*_* I. 2 javascript iterator iterable
我一直在尝试使用普通函数制作迭代器,没有生成器或将Symbol.iterator协议用于学术目的。为此,我创建了一个函数,该函数返回一个带有next参数的对象,但是尝试将它作为循环的iterable参数运行会for...of产生不需要的结果。
到目前为止,这是我从MDN 上的迭代器和生成器页面复制的代码:
function iterateThis(arr){
let i = 0;
return {
next: function() {
return i < arr.length ?
{value: arr[i++], done: false} :
{done: true};
}
};
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试像这样运行它:
const iterable = iterateThis([1,2,3,4,5]);
for(item in iterable){
console.log(item);
}
Run Code Online (Sandbox Code Playgroud)
在控制台上,我只得到一个结果:next.
我在创建函数时做错了iterateThis什么吗?还是for...of仅设计用于与发电机和Symbol.iterator财产一起工作?
在 Node v8.11.1 上执行
问题是您的iterateThis函数返回一个迭代器,但该for/of构造需要一个iterable。
好的,等等,有什么区别?
为了可迭代,对象必须实现该
@@iterator方法,这意味着该对象(或其原型链上的对象之一)必须具有一个带有@@iterator键的属性,该键可通过 constant 获得Symbol.iterator:
另一方面:
当一个对象实现了一个具有以下语义的方法时,它就是一个迭代器
next():由于长度而被忽略,TL;DR:下一个方法返回一个对象的形式:{value: T, done: boolean}
它们的相关性在于调用可迭代的@@iterator方法返回迭代器。
该for/of循环总是期望一个可迭代的,所以如果你想使用for/of,你必须使用@@iterator/ Symbol.iterator。据我所知,没有办法绕过它。但是您的代码段可以轻松修改以使用它,只需创建一个在Symbol.iterator调用方法时返回迭代器的对象:
function iterateThis(arr){
let i = 0;
return {
next: function() {
return i < arr.length ?
{value: arr[i++], done: false} :
{done: true};
}
};
}
function makeIterableFromIterator(iterator) {
return {
[Symbol.iterator]: function() {
return iterator;
}
}
}
const iterator = iterateThis([1, 2, 3, 4, 5]);
const iterable = makeIterableFromIterator(iterator);
for (item of iterable) {
console.log(item);
}Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |