前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >揭秘ES6的迭代器

揭秘ES6的迭代器

原创
作者头像
挥刀北上
发布2021-12-15 14:02:45
3730
发布2021-12-15 14:02:45
举报
文章被收录于专栏:Node.js开发Node.js开发

迭代器是ES2015中新增的规范,与之相关的for...of也是ES2015新增的。

本文来深入研究一下迭代器是什么,以及迭代器能够干什么?

迭代器是满足迭代器协议的对象,什么是迭代协议呢:

可迭代协议允许 JavaScript 对象去定义或定制它们的迭代行为, 例如(定义)在一个 for..of 结构中什么值可以被循环(得到)。一些内置类型都是内置的可迭代类型并且有默认的迭代行为, 比如 Array or Map, 另一些类型则不是 (比如Object) 。 为了变成可迭代对象, 一个对象必须实现 @@iterator 方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是 Symbol.iterator 的属性。

当一个对象需要被迭代的时候(比如开始用于一个for..of循环中),它的@@iterator方法被调用并且无参数,然后返回一个用于在迭代中获得值的迭代器。

说的云山雾罩的,简单总结:

1、迭代器就是满足迭代器协议的对象

2、迭代器对象的原型上必须有一个@@iterator 方法。

3、这个方法可以被对象上的Symbol.iterator属性访问到。

4、被迭代时,@@iterator方法被调用并且无参数,返回一个迭代器,这个迭代器上有一个next方法

5、next方法执行会便利其属性,返回一个对象对象属性有value,done为false一直遍历,为true时结束,结束时value没有值。

5、能被for of 循环的就是迭代器。

可迭代对象的必须存在[Symbol.iterator]方法,该方法一个无参函数,返回迭代器协议的对象。

迭代器对象包含一个next()函数,该函数返回值有两种:

如果迭代未结束,返回如下

代码语言:javascript
复制
return {
  value: 'item', // item是本次迭代值,可以为任意对象
  done: false
}

如果迭代已结束,返回如下

代码语言:javascript
复制
return {
  done: true
}

下面是未提供迭代器的示例。

代码语言:javascript
复制
const obj = {
  name: 'xialei',
  id: 1
};
for(let item of obj) { // TypeError: obj is not iterable
  
}

下面是提供迭代器的示例:

代码语言:javascript
复制
const obj = {
    name: 'xialei',
    id: 1,
    [Symbol.iterator]: function () { // 迭代器属性
        const keys = Object.keys(this); // 读取对象键列表
        let keyIndex = 0; // 遍历未知
        const self = this; // 保存this,next中的function会有自己的this
        return { // 返回带有next()的对象
            next: function () {
                if (keyIndex < keys.length) { // 防止越界
                    const key = keys[keyIndex];
                    keyIndex++; // 移动到下一个位置
                    return {
                        value: [key, self[key]], // 键值对数组
                        done: false
                    }
                }
                return { // 遍历结束
                    done: true
                }
            }
        }
    }
};

通过给obj提供迭代器方法让obj也可以使用for...of遍历。

直接去理解迭代器概念比较困难,用一个简单的例子去简化理解是一件很容易的事情。

其他可迭代对象:String,Array,Map,Set,TypedArray是所有内置的可迭代对象,他们的原型对象都有一个[Symbol.iterator]方法。下面是两种方法迭代String对象的示例。

代码语言:javascript
复制
// for ... of
const str = 'xialei';
for(const char of str) {
  console.log(char);
}
// iterator
const str = 'xialei';
const iterator = str[Symbol.iterator](); // 返回一个{next:方法}对象
let obj = null;
do {
    obj = iterator.next(); // 返回的是对象,{value:任意对象,done:布尔型}
    console.log(obj.value);
}while(!obj.done);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档