在 JavaScript 中,遍历器(Iterator)是一个比较重要的概念。它可以让我们遍历数据结构中的元素,比如数组、对象、字符串等等。在 ES6 中,我们已经学习了很多关于遍历器的知识,比如使用 for...of 循环、调用默认的遍历器方法等等。而在 ES9 中,遍历器方面的语法进一步得到了扩展和加强,本文将详细介绍这些新特性。
1. 遍历器方法的异步处理
在 ES6 中,我们可以使用 for...of 循环遍历数组或者使用 Symbol.iterator 方法得到默认的遍历器。这些方法没有处理异步的需求。而在 ES9 中,我们可以使用新的异步 Iterator 语法来处理异步的遍历器。异步 Iterator 的实现需要两个部分:异步遍历器对象和异步 Iterator 方法。
异步遍历器对象:
const asyncIterable = { [Symbol.asyncIterator]: () => { let i = 0; return { next: async () => { if (i < 3) { await new Promise((resolve) => setTimeout(resolve, 1000)); return { value: i++, done: false }; } return { done: true }; }, }; }, };
异步 Iterator 方法:
const asyncForEach = async (iterable, callback) => { for await (const value of iterable) { await callback(value); } };
使用这两个部分,我们可以遍历异步数据结构了:
const doStuff = async () => { await asyncForEach(asyncIterable, async (item) => { console.log(item); }); console.log("Done"); };
在这个例子中,我们使用 asyncForEach 方法遍历 asyncIterable 对象,并在每个值上执行 callback 回调函数。注意,这里的 for await...of 循环是异步的,必须使用 async/await 语法来等待回调完成。
2. 对象的遍历器
除了数组和字符串,对象也可以被遍历器遍历。在 ES9 中,新的 Object.entries() 和 Object.values() 方法可以将一个对象转化为一个遍历器对象)。这个遍历器对象中每个元素都是一个数组,第一个元素是键,第二个元素是值。
const obj = { a: 1, b: 2, c: 3 }; const entries = Object.entries(obj); console.log(entries); // [[ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ]]
在这个例子中,我们使用 Object.entries() 方法获取一个遍历器对象,然后通过 for...of 循环遍历它。每个元素都是一个包含键和值的数组。
3. Rest/Spread 参数
在 ES9 中,Rest 和 Spread 参数(用于函数参数的省略号语法)支持了对象和字符串的遍历器。这两个参数类型将被转换成可以被遍历器遍历的数据结构,使用方法同数组的 Rest/Spread 参数一样。
const obj = { a: 1, b: 2, c: 3 }; const objValues = { ...obj }; // Spread 参数变量 console.log(objValues); // { a: 1, b: 2, c: 3 } const str = "hello"; const strChars = [...str]; // Spread 参数变量 console.log(strChars); // [ 'h', 'e', 'l', 'l', 'o' ]
在这个例子中,我们使用了 Spread 参数将对象和字符串展开成了数组,便于遍历器遍历。
4. Promise.allSettled()
在 ES9 中,新增了 Promise.allSettled() 方法。它类似于 Promise.all() 方法,但不同的是 Promise.allSettled() 不会在任何一个 Promise 变成 rejected 状态时中止,并返回所有 Promise 的状态结果。
const promises = [ Promise.resolve("foo"), Promise.reject("bar"), Promise.resolve("baz"), ]; Promise.allSettled(promises).then((results) => { console.log(results); }); // Output: // [ // { status: 'fulfilled', value: 'foo' }, // { status: 'rejected', reason: 'bar' }, // { status: 'fulfilled', value: 'baz' } // ]
在这个例子中,我们使用 Promise.allSettled() 方法来处理一个可能会被 rejected 的 Promise。即使有一个 Promise 被拒绝了,Promise.allSettled() 也会返回所有 Promise 的状态结果。
总结
在 ES9 中,遍历器方面的语法得到了扩展和加强。我们学习了异步遍历器、对象的遍历器、Rest/Spread 参数的遍历器处理和 Promise.allSettled() 方法。这些新特性丰富了 JavaScript 的遍历器功能,可以帮助我们更加方便、高效地处理不同的数据结构。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b77493add4f0e0ff002964