ES6—Iterator

Iterator(遍历器)

为不同的数据结构提供统一的访问机制的接口(本质是一个指针对象
三大作用:

  1. 为各种数据结构提供统一简便的访问接口
  2. 使数组成员按某种次序排列
  3. 主要供for…of消费

默认的Iterator接口

使用for…of循环遍历某种数据结构时,该循环会自动寻找Iterator接口
原生具有Iterator接口的数据结构:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的arguments对象
  • NodeList对象
    遍历器对象的next方法,在返回一个值的同时自动将内部指针移到下一个实例

调用Iterator接口的场合

  1. 解构赋值
    对数组和Set结构进行解构赋值时,会默认调用Symbol.iterator方法
  2. 扩展运算符
    …也会调用默认的Iteraotr接口
  3. 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 }
  1. 其他场合
  • for…of
  • Array.from()
  • Map()、 Set()、 WeakMap()、 WeakSet()
  • Promise.all()
  • Promise.race()

字符串的Iterator接口

next方法可以覆盖原生的Symbol.iterator方法达到修改遍历器行为的目的

// 只有调用遍历器接口才会触发
console.log([...str]);
console.log(...str);
str[Symbol.iterator] = function() {
  return {
    next: function() {
      if (this._first) {
        this._first = false;
        return { value: "bye", done: false };
      } else {
        return { done: true };
      }
    },
    _first: true
  };
};

console.log([...str]); // ["bye"]
console.log(str); // "hi"

Iterator接口与Generator函数

**let obj = {
  * [Symbol.iterator]() {
    yield 'hello';
    yield 'world';
  }
};

for (let x of obj) {
  console.log(x);
}
// "hello"
// "world"**

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

遍历器对象除了next方法,还有可选的return和throw方法

for…of循环

普通的对象不能直接使用for…of结构,可以使用for…in循环
部署了Iterator接口可以使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值