概述
在 ECMAScript 2015 中,Iterator 协议被引入,它是一种对象的接口,为各种不同的数据结构提供了统一的访问机制。在 ECMAScript 2018 (ES9) 中,Iterator 进一步被添加了新特性,本文将对这些新特性进行详细介绍。
for-await-of 循环
for-await-of 循环是 ES9 中引入的新循环,它是 for-of 循环的异步版本,用于遍历异步可迭代的对象(例如 async 函数的返回值)。语法如下:
async function processAsyncIterable(asyncIterable) { for await (let item of asyncIterable) { // 处理 item } }
可以通过添加 async 前缀,将 for-of 循环转换为 for-await-of 循环。当遍历 asyncIterable 时,await 关键字会暂停循环并等待每个 Promise 解析为它的最终值。这里要注意的是,for-await-of 循环只能用于异步可迭代的对象,如果对象是同步的,则应该使用 for-of 循环。
新的 Iterator 方法:Array.prototype.entries(),Array.prototype.keys() 和 Array.prototype.values()
ES6 引入了 Array.prototype@@iterator 和 Array.prototype.forEach(), 而 ES9 则在此基础上添加了三个新的 Iterator 方法:Array.prototype.entries(),Array.prototype.keys() 和 Array.prototype.values()。这三个方法分别返回一个包含键/值对、索引和值的迭代器对象,允许更精细的控制数据的遍历。
- Array.prototype.entries():返回一个包含键/值对的迭代器对象。每个键/值对都是一个包含两个元素的数组 [index, value]。
const arr = ['a', 'b', 'c']; const entries = arr.entries(); console.log(entries.next().value); // [0, 'a'] console.log(entries.next().value); // [1, 'b'] console.log(entries.next().value); // [2, 'c']
- Array.prototype.keys():返回一个包含数组索引的迭代器对象。
const arr = ['a', 'b', 'c']; const keys = arr.keys(); console.log(keys.next().value); // 0 console.log(keys.next().value); // 1 console.log(keys.next().value); // 2
- Array.prototype.values():返回一个包含数组中每个元素的值的迭代器对象。
const arr = ['a', 'b', 'c']; const values = arr.values(); console.log(values.next().value); // 'a' console.log(values.next().value); // 'b' console.log(values.next().value); // 'c'
需要注意的是,使用这三个方法返回的迭代器对象都是惰性的,只有在被访问时才会生成相应的迭代器对象。
总结
以上是 ECMAScript 2018 (ES9) 带来的 Iterator 新特性的详细介绍。这些新特性增强了 Iterator 协议在遍历数据结构方面的灵活性和可控性,提高了开发者在处理异步数据时的效率和便捷性。建议开发者在实际开发过程中,结合实际情况使用这些新特性,提高代码的可读性和维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b25c9968c7c53b0d82a73