Iterator遍历器

        Iterator接口的目的是:为所有的数据结构提供一种统一的访问机制,即for。。。of 循环。

当使用for。。。of 循环遍历某种数据结构时,该循环会自动寻找Iterator接口。

        一种数据结构只要部署了Iterator接口,我们就称这种数据结构是可遍历的

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

    Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。

 

 

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

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

eg:

let arr = [1,2,3]
let iter = arr[Symbol.Iterator]()
iter.next() // { value: '1', done: false }
iter.next() // { value: '2', done: false }
iter.next() // { value: '3', done: false }
iter.next() // { value: undefined, done: true }

在上面的例子中,arr是一个数组,原生就有Itarator遍历器接口。部署在arr的Symbol.Iterator属性上面,所以调用这个属性就能得到遍历器对象。

除了for...of循环会默认调用Iterator接口外,还有其他场合:

1.对数组和Set数据结构进行解构赋值或使用扩展运算符时,会默认调用Symbol.iterator方法。

解构赋值

let [x,y] = set;

 使用扩展运算符

只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。

// 例一
var str = 'hello';
[...str] //  ['h','e','l','l','o']

// 例二
let arr = ['b', 'c'];
['a', ...arr, 'd']
// ['a', 'b', 'c', 'd']

 yield*

yield*后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口。

let generator = function* () {
  yield 1;
  yield* [2,3,4];
  yield 5;
};

var iterator = generator();

iterator.next() // { value: 1, done: false }
iterator.next() // { value: 2, done: false }
iterator.next() // { value: 3, done: false }
iterator.next() // { value: 4, done: false }
iterator.next() // { value: 5, done: false }
iterator.next() // { value: undefined, done: true }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值