ES6的Iterator 和 for...of 循环

写在前面

在JavaScript中,Iterator(遍历器)是一种接口,用于遍历数据结构(如数组、对象等)中的元素。它提供了一种统一的方式来访问集合中的每个项,包括值和位置。

默认 Iterator 接口

许多内置的JavaScript对象都有默认的Iterator接口,例如:

  • Array对象:可以使用for...of循环或Array.prototype[Symbol.iterator]()方法来获取其Iterator对象。
  • Map和Set对象:同样可以使用for...of循环或Map.prototype[Symbol.iterator]()Set.prototype[Symbol.iterator]()方法来获取其Iterator对象。
  • String对象:可以使用for...of循环或String.prototype[Symbol.iterator]()方法来获取其Iterator对象。

调用 Iterator 接口的场合

当你需要遍历一个数据结构中的所有元素时,可以使用Iterator接口。例如:

javascript 复制代码
const arr = [1, 2, 3];
const iterator = arr[Symbol.iterator]();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

字符串的 Iterator 接口

字符串的Iterator接口允许我们逐个字符地遍历字符串。例如:

javascript 复制代码
const str = 'hello';
const iterator = str[Symbol.iterator]();

console.log(iterator.next()); // { value: 'h', done: false }
console.log(iterator.next()); // { value: 'e', done: false }
console.log(iterator.next()); // { value: 'l', done: false }
console.log(iterator.next()); // { value: 'l', done: false }
console.log(iterator.next()); // { value: 'o', done: false }
console.log(iterator.next()); // { value: undefined, done: true }

Iterator 接口与 Generator 函数

Generator函数是一种特殊的函数,它可以用来生成Iterator对象。例如:

javascript 复制代码
function* generateNumbers() {
  yield 1;
  yield 2;
  yield 3;
}

const iterator = generateNumbers();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

遍历器对象的 return() 和 throw()

遍历器对象有两个额外的方法:return()throw()

  • return():可以在遍历器完成之前强制结束遍历,并返回一个指定的值。
  • throw():可以在遍历器中抛出一个错误。

例如:

javascript 复制代码
function* generateNumbers() {
  yield 1;
  yield 2;
  yield 3;
}

const iterator = generateNumbers();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.return(42)); // { value: 42, done: true }
console.log(iterator.next()); // { value: undefined, done: true }

// throw() example
try {
  console.log(iterator.throw(new Error('Something went wrong')));
} catch (error) {
  console.error(error); // Something went wrong
}

for...of 循环

for...of循环是JavaScript中的一种语法结构,用于遍历可迭代对象(如数组、字符串、Map、Set等)。它会自动调用对象的Iterator接口来获取每个元素。例如:

javascript 复制代码
const arr = [1, 2, 3];

for (const num of arr) {
  console.log(num);
}
// Output: 1, 2, 3

const str = 'hello';

for (const char of str) {
  console.log(char);
}
// Output: h, e, l, l, o

总之,Iterator和for...of循环提供了一种强大而灵活的方式来遍历和处理各种类型的数据结构。

相关推荐
jiayong232 分钟前
Vue2 与 Vue3 常见面试题精选 - 综合宝典
前端·vue.js·面试
We་ct9 分钟前
LeetCode 383. 赎金信:解题思路+代码解析+优化实战
前端·算法·leetcode·typescript
东东51618 分钟前
OA自动化居家办公管理系统 ssm+vue
java·前端·vue.js·后端·毕业设计·毕设
周某人姓周22 分钟前
DOM型XSS案例
前端·安全·web安全·网络安全·xss
程序员鱼皮33 分钟前
前特斯拉 AI 总监:AI 编程最大的谎言,是 “提效”
前端·后端·ai·程序员·开发
pusheng202544 分钟前
普晟传感2026年新春年会总结与分析
前端·javascript·html
谢尔登1 小时前
React19事件调度的设计思路
前端·javascript·react.js
Emma_Maria1 小时前
本地项目html和jquery,访问地址报跨域解决
前端·html·jquery
奋斗吧程序媛1 小时前
常用且好用的命令
前端·编辑器
2301_796512521 小时前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Lazyload 懒加载(懒加载的图片)
前端·javascript·react native·react.js·ecmascript·harmonyos