hand
_1_11_280
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 21:17:04
在 JavaScript 中,可迭代协议是一个强大且基础的概念,它允许我们以一种统一的方式处理各种数据结构。随着 JavaScript 的不断发展,可迭代协议也在不断扩展和增强,引入了许多新的特性,让我们的代码更加简洁、高效和富有表现力。本文将深入探讨可迭代协议的扩展和增强,以及新的可迭代特性。
在正式探讨扩展和增强之前,我们先简单回顾一下可迭代协议的基础。一个对象如果实现了 Symbol.iterator
方法,那么它就是可迭代对象。Symbol.iterator
方法必须返回一个迭代器对象,该对象具有 next()
方法,next()
方法返回一个包含 value
和 done
属性的对象,value
表示当前迭代的值,done
是一个布尔值,表示迭代是否结束。
下面是一个简单的可迭代对象示例:
const myIterable = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (const item of myIterable) {
console.log(item); // 输出 1, 2, 3
}
for...of
循环的广泛应用展开语法(Spread syntax)是可迭代协议扩展的一个重要体现。它允许我们将一个可迭代对象展开为多个元素,在数组字面量、函数调用等场景中非常有用。
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const combined = [...arr1,...arr2];
console.log(combined); // 输出 [1, 2, 3, 4, 5, 6]
function sum(a, b, c) {
return a + b + c;
}
const numbers = [1, 2, 3];
const result = sum(...numbers);
console.log(result); // 输出 6
for...of
循环for...of
循环可以遍历任何可迭代对象,这使得我们可以使用统一的语法来处理不同类型的数据结构。
const str = 'hello';
for (const char of str) {
console.log(char); // 依次输出 'h', 'e', 'l', 'l', 'o'
}
Array.from()
Array.from()
方法可以将一个可迭代对象或类数组对象转换为真正的数组。它还可以接受一个映射函数作为第二个参数,用于对每个元素进行转换。
const iterable = {
0: 'a',
1: 'b',
2: 'c',
length: 3
};
const arr = Array.from(iterable);
console.log(arr); // 输出 ['a', 'b', 'c']
const mappedArr = Array.from(iterable, (value) => value.toUpperCase());
console.log(mappedArr); // 输出 ['A', 'B', 'C']
String.prototype.matchAll()
String.prototype.matchAll()
方法返回一个包含所有匹配项的迭代器,这使得我们可以更方便地处理正则表达式的全局匹配。
const str = 'hello world, hello javascript';
const regex = /hello/g;
const matches = str.matchAll(regex);
for (const match of matches) {
console.log(match.index); // 输出 0 和 13
}
随着 JavaScript 中异步编程的发展,引入了异步可迭代协议。一个对象如果实现了 Symbol.asyncIterator
方法,那么它就是异步可迭代对象。Symbol.asyncIterator
方法必须返回一个异步迭代器对象,该对象具有 next()
方法,next()
方法返回一个 Promise,该 Promise 解析为一个包含 value
和 done
属性的对象。
下面是一个简单的异步可迭代对象示例:
const asyncIterable = {
data: [1, 2, 3],
[Symbol.asyncIterator]() {
let index = 0;
return {
next: () => {
return new Promise((resolve) => {
if (index < this.data.length) {
resolve({ value: this.data[index++], done: false });
} else {
resolve({ value: undefined, done: true });
}
});
}
};
}
};
(async () => {
for await (const item of asyncIterable) {
console.log(item); // 输出 1, 2, 3
}
})();
特性 | 描述 | 示例 |
---|---|---|
展开语法 | 将可迭代对象展开为多个元素 | [...arr1,...arr2] |
for...of 循环 |
遍历可迭代对象 | for (const item of iterable) {} |
Array.from() |
将可迭代对象或类数组对象转换为数组 | Array.from(iterable) |
String.prototype.matchAll() |
返回包含所有匹配项的迭代器 | str.matchAll(regex) |
异步可迭代协议 | 处理异步数据的迭代 | for await (const item of asyncIterable) {} |
通过可迭代协议的扩展、增强和新特性,JavaScript 提供了更加灵活和强大的方式来处理各种数据结构和异步数据。掌握这些知识,将有助于我们编写更加高效和简洁的代码。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~