在 JavaScript 中,迭代器(Iterator)是一种对象,它可以按需取出一系列的值。ES6 引入了迭代器的概念,并在 JavaScript 的标准库中提供了一个默认的迭代器协议(Iterator Protocol)。该协议定义了一个 next
方法,用于按需提供下一个值,并返回一个包含 done
和 value
属性的对象。
ES9(ECMAScript 2018)进一步扩展了这个迭代器协议,引入了同步迭代器和异步迭代器,为 JavaScript 提供了更加灵活的迭代能力。
同步迭代器
同步迭代器是基于迭代器协议的一种新型迭代器,它提供了一种同步获取值的方式。同步迭代器的定义方式与普通迭代器相同,只不过需要实现一个新的方法 Symbol.iterator
,该方法不接受任何参数,返回一个实现了 next
方法的对象。
同步迭代器的使用方式与普通迭代器类似,只需要使用 for...of
循环遍历即可。下面是一个示例代码:
const arr = [1, 2, 3]; const iter = arr[Symbol.iterator](); for (const item of iter) { console.log(item); // 1, 2, 3 }
同步迭代器的一个优点在于,它可以用于将任何数据类型转换为可迭代的对象。比如,我们可以将一个对象定义为一个可迭代对象,从而使得它可以被 for...of
循环遍历。下面是一个示例代码:
-- -------------------- ---- ------- ----- --- - - ----- --- -- --- ------------------- - --- ----- - -- ----- ---- - ---------- ------ - ------ - -- ------ -- ------------ - ------ - ----- ---- -- - ---- - ------ - ------ -------------- ----- ----- -- - - -- - -- --- ------ ---- -- ---- - ------------------ -- -- -- - -
异步迭代器
异步迭代器是一种新型的迭代器,它提供了一种异步获取值的方式。异步迭代器的定义方式与同步迭代器类似,只需要实现一个新的方法 Symbol.asyncIterator
,该方法不接受任何参数,返回一个实现了 next
方法的对象。
异步迭代器的使用方式与同步迭代器类似,只不过需要使用 for await...of
循环遍历。下面是一个示例代码:
-- -------------------- ---- ------- ----- --------- ----- - ----- -- ----- -- ----- -- - ------ -------- -- - --- ----- ------ ---- -- ------ - ------------------ -- -- -- - - -----
异步迭代器可以与异步函数一起使用,用于获取一些异步操作的结果。下面是一个示例代码:
-- -------------------- ---- ------- ----- --------- --------- - ----- ------ - ----- ---- - ----- ------------ -- ------- - ------ - ----- ----- - - ------ -------- -- - --- ----- ------ ---- -- ---------- - ------------------ - -----
总结
ES9 中引入了同步迭代器和异步迭代器,它们提供了一种新的迭代方式,使得 JavaScript 可以更加灵活地对数据进行操作。同步迭代器和异步迭代器的使用方法类似,只需要实现不同的协议即可。在实际开发中,可以根据实际需求选择使用不同的迭代器,以便更好地进行数据操作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645a4b25968c7c53b0c89bbe