JS - iterator(迭代器)

这篇具有很好参考价值的文章主要介绍了JS - iterator(迭代器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、 概念

       JavaScript原有表示“集合”的数据结构,主要是数组(' Array ')和对象(' Object ' ),ES6又添加了Map和Set。这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象。这样就需要一种统一的接口机制,来处理不同的数据结构。
       遍历器(Iterator)就是这样一种机制。它是一种接口,为不同的数据结构提供一种访问机制,即for ... of 循环。当使用for...of循环遍历某种数据结构时,该循环会自动去寻找 Iterator 接口。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。

二、本质 

        迭代器对象本质上,就是一个指针对象。通过指针对象的next(), 用来移动指针。
       
迭代器协议:对象必须提供一个next(),执行该方法要么返回迭代的下一项,要么就引起Stopiteration异常,以终止迭代。
        每调用一次next ()方法,都会返回一个对象,都会返回数据结构的当前成员的信息。这个对象有 value 和 done 两个属性,value属性返回当前位置的成员,done属性是一个布尔值,表示遍历是否结束,即是否有必要再调用一次next () 。对于遍历器来说,value:undefined和done:false属性都是可以省略的。
        
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性上;或者说,一个数据结构只要有Symbol.iterator属性,就认为是可遍历的。

三、实现Iterator接口的原生对象

原生具备Iterator接口的数据结构有:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象

 可以看到Array原型对象已经实现了Iterator这个属性:
JS - iterator(迭代器)

 那么数组的实例对象也拥有这个属性,可以调用试试:
JS - iterator(迭代器)

下面是模拟next()方法返回的例子:
JS - iterator(迭代器)

       上面的代码定义了一个makeIterator函数,它是一个遍历器生成的函数,作用就是返回一个遍历器对象。对数组[ ’a', 'b' ]执行这个函数,就会返回该数组的遍历器对象(指针对象)it。指针对象的next方法,用来移动指针。开始时,指针指向数组的开始位置。然后,每次调用next方法,指针就会指向数组的下一个成员。第一次调用,指向a;第二次调用,指向b
        总之,调用指针对象的next()方法,就可以遍历事先给定的数据结构。
        上面说了,对于遍历器对象来说, done:false 和 value:undefined属性都是可以省略的,因此上面的makeIterator函数可以简写成下面的形式。
JS - iterator(迭代器)

 使用场合:

① 对实现了Iterator接口的数据解构赋值

JS - iterator(迭代器)

 ② 扩展运算符

JS - iterator(迭代器)

上面代码的扩展运算符内部就调用 Iterator 接口。

实际上,这提供了一种简便机制,可以将任何部署了 Iterator 接口的数据结构,转为数组。也就是说,只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。

三、 for... of 循环

for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、字符串等。

数组原生具备iterator接口,(默认部署Symbol.iterator属性),for...of 循环本质上就是调用这个接口产生的遍历器:

const arr = ['red', 'green', 'blue'];

for(let v of arr) {
  console.log(v); // red green blue
}

const obj = {};
obj[Symbol.iterator] = arr[Symbol.iterator].bind(arr);

for(let v of obj) {
  console.log(v); // red green blue
}

上面代码中,空对象obj部署了数组arrSymbol.iterator属性,结果objfor...of循环,产生了与arr完全一样的结果。

for ... of 循环可以代替数组实例 forEach 方法。

const arr = ['red', 'green', 'blue'];

arr.forEach(function (element, index) {
  console.log(element); // red green blue
  console.log(index);   // 0 1 2
});

JavaScript 原有的for...in循环,只能获得对象的键名,不能直接获取键值。ES6 提供for...of循环,允许遍历获得键值。

var arr = ['a', 'b', 'c', 'd'];

for (let a in arr) {
  console.log(a); // 0 1 2 3
}

for (let a of arr) {
  console.log(a); // a b c d
}

四、 Set 和 Map结构

Set和Map结构也原生具有Interator接口,可以直接使用for...of循环。

var engines = new Set(['1','2','3']);
for (var e of engines) {
  console.log(e);   // 1  2  3
} 

var class = new Map();
class .set('Tom', 12);
class .set('Lala', 13);
class .set('9300', 14);
for (var [name,value] of class) {
  console.log(name + ':' + number);    // Tom:12  Lala:13  9300:14
}     

以上代码演示了如何遍历Set和Map结构。需要注意的是,首先遍历的顺序是按照哥哥成员被添加进数据结构的顺序。其次,Set结构遍历时,返回的是一个值。而Map结构遍历时,返回的是一个数组,该数组的两个成员分别是当前Map成员的键名和键值。

let map = new Map().set('a', 1).set('b', 2);
for (let pair of map) {
  console.log(pair);
}
// ['a', 1]
// ['b', 2]

for (let [key, value] of map) {
  console.log(key + ' : ' + value);
}
// a : 1
// b : 2

其他内容可参照 ES6入门文章来源地址https://www.toymoban.com/news/detail-469555.html

到了这里,关于JS - iterator(迭代器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <Java Iterator> 迭代器Iterator双层循环

    案例分享: 测试输出:

    2024年02月15日
    浏览(34)
  • <Java Iterator> 迭代器Iterator双层循环 案例分享

    需求: 需要一个按钮,每次执行的时候,调接口刷新数据库表中的数据: 刷新条件: 如果接口获取的数据和数据库表的数据完全一致则不刷新,如果不一致,则新增数据;

    2024年02月15日
    浏览(75)
  • C++迭代器(STL迭代器)iterator详解

    要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。 迭代器按照定义方式分

    2024年02月03日
    浏览(35)
  • 迭代器 Iterator

    迭代器是一种设计模式,它用于遍历集合或容器中的元素,能够访问集合的元素而无需关心集合的内部结构: 特点: 封装集合访问 :迭代器封装了对集合元素的访问,通过迭代器访问集合中的元素,而无需了解集合的内部结构或实现方式。 统一接口 :迭代器提供了一致的

    2024年02月08日
    浏览(37)
  • Python迭代器(Iterator)

    迭代是访问集合元素的一种方式 迭代器是一个可以记住遍历位置的对象。迭代器对象从第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前不会后退。 能用for循环遍历的对象 for循环的过程可以通过上面的iter()和next()函数来实现,即: 1、先调用iter(),将nums当

    2024年02月15日
    浏览(28)
  • 递归(recurse)与迭代(iteration)

    递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。也就是说,递归算法是一种 直接或者间接调用自身方法 的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。 注意: 递归必须要有一个退出的条件! 递归算法解决问题的特点: 1)递归就是方

    2024年02月10日
    浏览(30)
  • 迭代器模式(Iterator Pattern)

    一、定义 提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。 二、优缺点 优点:  1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类

    2024年02月09日
    浏览(36)
  • Python——迭代器(可迭代、可迭代对象、迭代器、遍历本质、iter函数、next函数、__iter__方法、__next__方法、自定义可迭代对象与自定义迭代器、for循环本质)

    迭代(iter) 我们经常听说过\\\"版本迭代\\\"这个词,意思是在原来版本的基础上,再提升一个版本的过程。那么我们仅仅看看\\\"迭代\\\"这个词,会发现迭代就是一个根据原来的状态决定本次状态的过程 迭代应用于Python中,迭代具体是指根据原来的数据输出(并不一定是要打印,也可

    2024年02月04日
    浏览(40)
  • 无涯教程-Lua - Iterators(迭代器)

    迭代器是一种构造,使您可以遍历所谓的集合或集合的元素。在Lua中,这些集合通常引用表,这些表用于创建各种数据结构(如数组)。 通用的 for 迭代器提供集合中每个元素的键值对。下面给出一个简单的示例。 当无涯教程运行上面的代码时,将获得以下输出- 上面的示例使

    2024年02月14日
    浏览(27)
  • 【Java杂谈】Iterator(迭代器)的使用

    迭代器是Java提供的一种访问集合的方法,Iterator 是 Java 迭代器最简单的实现,常用来访问ArrayList、HashMap等类的对象。 Iterator是一个接口,ListIterator是Collection API中的接口,它扩展了Iterator接口: 可以使用iterator() 方法: hasNext()方法的作用是没有遍历完成 next()方法有两个作用

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包