编程 js迭代器

2024-11-19 07:49:47 +0800 CST views 585

迭代器(一)

目录

  1. 简介
  2. 自定义一个简单迭代器

简介

迭代器是一个对象,它定义了一个序列,并在终止时附带一个返回值。迭代器的作用是为不同的数据结构提供统一的遍历访问机制,使数据结构中的元素能够按顺序依次被遍历(如 for...of 语法)。

任何实现了 next() 方法并符合迭代器协议的对象都可以称为迭代器。next() 方法返回一个对象,该对象包含两个属性:

  • value: 迭代序列的下一个值;
  • done: 一个布尔值,表示是否已迭代到序列的最后一个值。

当迭代器被创建后,可以通过调用 .next() 显式地迭代。最后一次 .next() 调用返回 done: true,表明迭代结束。


自定义一个简单迭代器

以下代码实现了一个从 startend 的计数迭代器,最终返回值为 end

const testIterator = (start = 1, end = 5) => {
  let count = start - 1;
  const result = {
    next() {
      if (count < end) {
        count++;
        return { value: count, done: count === end };
      } else {
        return { value: count, done: true };
      }
    }
  };
  return result;
};

const customItertor = testIterator();
for (const index of Array(7)) {
  console.log(customItertor.next());
}

输出

{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }
{ value: 5, done: true }
{ value: 5, done: true }
{ value: 5, done: true }

迭代器(二)

目录

  1. 遍历原理解析
  2. 将原生对象改造为可迭代对象

遍历原理解析

迭代器为不同的数据结构提供了统一的访问机制,只要数据结构具备 iterator 接口,便可使用 for...of 遍历其所有成员。

例如,ArrayMapSetString 等都可以使用 for...of 遍历:

const arr = [1, 2, 3, 4, 5];
for (const item of arr) {
  console.log('item:', item);
}

输出

item: 1
item: 2
item: 3
item: 4
item: 5

通过 Symbol.iterator,可以看到数组内部已经实现了 iterator,保证了数组按序遍历。for...of 实际是通过迭代器的 next() 方法来逐步移动指针,依次输出每个元素,直到遍历完成。


将原生对象改造为可迭代对象

原生对象并不支持 for...of 遍历。我们可以通过实现 iterator 接口,将不可遍历的对象改造为可遍历对象。

const obj = {
  key1: 'value-1',
  key2: 'value-2',
  key3: 'value-3'
};

for (const value of obj) {
  console.log('value:', value);
}

输出(不支持遍历):

TypeError: obj is not iterable

改造为可迭代对象

通过自定义 Symbol.iterator,将对象改造成可遍历对象:

const obj = {
  key1: 'value-1',
  key2: 'value-2',
  key3: 'value-3',
  [Symbol.iterator]: function() {
    const self = this;
    const keys = Object.keys(self);
    let curKeyIndex = -1;

    const result = {
      next() {
        if (curKeyIndex < keys.length - 1) {
          curKeyIndex++;
          return { value: self[keys[curKeyIndex]], done: false };
        }
        return { value: undefined, done: true };
      }
    };

    return result;
  }
};

for (const value of obj) {
  console.log('value:', value);
}

输出

value: value-1
value: value-2
value: value-3

注意:Symbol.iterator 是一个预定义的 Symbol 类型值,用于定义默认的迭代行为。


复制全文 生成海报 JavaScript 编程 数据结构

推荐文章

Nginx rewrite 的用法
2024-11-18 22:59:02 +0800 CST
Vue3中如何实现响应式数据?
2024-11-18 10:15:48 +0800 CST
thinkphp swoole websocket 结合的demo
2024-11-18 10:18:17 +0800 CST
Python实现Zip文件的暴力破解
2024-11-19 03:48:35 +0800 CST
pin.gl是基于WebRTC的屏幕共享工具
2024-11-19 06:38:05 +0800 CST
Vue 3 路由守卫详解与实战
2024-11-17 04:39:17 +0800 CST
Rust 高性能 XML 读写库
2024-11-19 07:50:32 +0800 CST
跟着 IP 地址,我能找到你家不?
2024-11-18 12:12:54 +0800 CST
一文详解回调地狱
2024-11-19 05:05:31 +0800 CST
随机分数html
2025-01-25 10:56:34 +0800 CST
JS中 `sleep` 方法的实现
2024-11-19 08:10:32 +0800 CST
Nginx 实操指南:从入门到精通
2024-11-19 04:16:19 +0800 CST
Vue3中的事件处理方式有何变化?
2024-11-17 17:10:29 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
纯CSS绘制iPhoneX的外观
2024-11-19 06:39:43 +0800 CST
Vue3如何执行响应式数据绑定?
2024-11-18 12:31:22 +0800 CST
乐观锁和悲观锁,如何区分?
2024-11-19 09:36:53 +0800 CST
基于Flask实现后台权限管理系统
2024-11-19 09:53:09 +0800 CST
程序员茄子在线接单