ES6 迭代器

更新日期: 2019-10-14阅读: 1.7k标签: es6

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

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

或许你对for ... of的执行还不了解,比如什么情况下可以使用for ... of去遍历对象,什么情况下会报错等等,这篇文章应该能帮到你。


迭代器协议

for ... of只能迭代满足【迭代器协议】的对象

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

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

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

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

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

return {
  done: true
}

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

const obj = {
  name: 'xialei',
  id: 1
};
for(let item of obj) { // TypeError: obj is not iterable
  
}

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

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对象的示例。

// 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);


结尾

迭代器协议虽然一般用的比较少,但是了解其原理是非常有必要的,这样才可以才需要的实现定义自己的迭代器来遍历对象。


链接: https://fly63.com/article/detial/6437

es6 箭头函数的使用总结,带你深入理解js中的箭头函数

箭头函数是ES6中非常重要的性特性。它最显著的作用就是:更简短的函数,并且不绑定this,arguments等属性,它的this永远指向其上下文的 this。它最适合用于非方法函数,并且它们不能用作构造函数。

详解JavaScript模块化开发require.js

js模块化的开发并不是随心所欲的,为了便于他人的使用和交流,需要遵循一定的规范。目前,通行的js模块规范主要有两种:CommonJS和AMD

js解构赋值,关于es6中的解构赋值的用途总结

ES6中添加了一个新属性解构,允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量。用途:交换变量的值、从函数返回多个值、函数参数的定义、提取JSON数据、函数参数的默认值...

ES6中let变量的特点,使用let声明总汇

ES6中let变量的特点:1.let声明变量存在块级作用域,2.let不能先使用再声明3.暂时性死区,在代码块内使用let命令声明变量之前,该变量都是不可用的,4.不允许重复声明

ES6的7个实用技巧

ES6的7个实用技巧包括:1交换元素,2 调试,3 单条语句,4 数组拼接,5 制作副本,6 命名参数,7 Async/Await结合数组解构

ES6 Decorator_js中的装饰器函数

ES6装饰器(Decorator)是一个函数,用来修改类的行为 在设计阶段可以对类和属性进行注释和修改。从本质上上讲,装饰器的最大作用是修改预定义好的逻辑,或者给各种结构添加一些元数据。

基于ES6的tinyJquery

Query作为曾经Web前端的必备利器,随着MVVM框架的兴起,如今已稍显没落。用ES6写了一个基于class简化版的jQuery,包含基础DOM操作,支持链式操作...

ES6 中的一些技巧,使你的代码更清晰,更简短,更易读!

ES6 中的一些技巧:模版字符串、块级作用域、Let、Const、块级作用域函数问题、扩展运算符、函数默认参数、解构、对象字面量和简明参数、动态属性名称、箭头函数、for … of 循环、数字字面量。

Rest/Spread 属性_探索 ES2018 和 ES2019

Rest/Spread 属性:rest操作符在对象解构中的使用。目前,该操作符仅适用于数组解构和参数定义。spread操作符在对象字面量中的使用。目前,这个操作符只能在数组字面量和函数以及方法调用中使用。

使用ES6让你的React代码提升到一个新档次

ES6使您的代码更具表现力和可读性。而且它与React完美配合!现在您已了解更多基础知识:现在是时候将你的ES6技能提升到一个新的水平!嵌套props解构、 传下所有props、props解构、作为参数的函数、列表解构

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!