美文网首页
2018-01-19 ES6 阮一峰教程摘记11 遍历方法

2018-01-19 ES6 阮一峰教程摘记11 遍历方法

作者: 安乐_f487 | 来源:发表于2018-09-10 22:19 被阅读0次

    Iterator和for...of循环

    1.Iterator遍历器的概念

    JS表示“集合”的数据结构有:Array,Object,Map,Set,这四种也可以组合使用。情况比较复杂,

    需要一种统一的接口机制,来处理所有不同的数据结构--iterator遍历器就是。

    任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

    Iterator的三个作用:

    1.为各种数据结构,通过统一的、简便的访问接口;

    2.使数据结构的成员能按照某种次序排列;

    3.主要供ES6新的遍历命令for...of消费

    遍历过程:具体略,主要点:遍历器对象(指针对象),next方法,返回value,done(布尔值,遍历是否结束)

    模拟遍历过程的例子

    2.默认Iterator接口

    Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环。当使用for...of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。

    ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)

    Symbol.iterator属性

    原生具备 Iterator 接口(即原生部署了Symbol.iterator属性)的数据结构如下:

    原生具备Iterator的数据结构

    其他原生不具备Iterator的数据结构(主要是Object),都需要自己在Symbol.iterator属性上面部署,例如上上图所示

    对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。

    不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。

    3.调用Iterator接口的场合

    (1)解构赋值

    (2)扩展运算符(...)

    (3)yield*

    (4)其他场合

    由于数组的遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用了遍历器接口。下面是一些例子

    4.字符串的Iterator接口

    5.Iterator接口和Generator函数

    Symbol.iterator方法的最简单的实现就是使用Generator函数和yeild??先跳过,学了函数后再回顾

    6.遍历器对象的return()、throw()

    return():遍历没有都完成(可能是因为出错、有break语句、continue语句)时会执行,该方法必须返回一个对象(这是 Generator 规格决定的)

    throw方法主要是配合 Generator 函数使用,一般的遍历器对象用不到这个方法。请参阅《Generator 函数》一章

    7.for...of循环

    与其他遍历语法的比较:

    for

    forEach--array(中途无法跳出循环)

    for..in

    相关文章

      网友评论

          本文标题:2018-01-19 ES6 阮一峰教程摘记11 遍历方法

          本文链接:https://www.haomeiwen.com/subject/hgzooxtx.html