迭代器Iterator

  • 迭代器Iterator
    表示集合的数据结构:数组和对象(js定义的)、Map和Set(Es6新增的)。如何访问这些不同的数据结构呢,Es6提供了一个统一的管理接口,就是迭代器Iterator,也就是只要部署遍历器(Iterator),就可以完成遍历操作。
  • 迭代器Iterator的作用
    一是为各种数据结构,提供一个统一的、简便的访问接口;
    二是使得数据结构的成员能够按某种次序排列;
    三是 ES6 创造了一种新的遍历命令for…of循环,Iterator 接口主要供for…of消费。
  • 遍历器Iterator属性:Symbol.iterator
    具有这个属性的数据结构都有可遍历性。
  • 原生具备 Iterator 接口的数据结构如下。
    Array
    Map
    Set
    String
    TypedArray
    函数的 arguments 对象
    NodeList 对象
    *对象没有原生的遍历器属性,对象(Object)之所以没有默认部署 Iterator 接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,而 ES6 原生提供了。
  • 怎样给不具有遍历器的对象,类数组添加遍历器属性
    1.对象
    一个对象如果要具备可被for…of循环调用的 Iterator 接口,就必须在Symbol.iterator的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。
    2.类数组
    ex:NodeList.prototype[Symbol.iterator]=Array.prototype[Symbol.iterator];
    let iterable = {
    0: ‘a’,
    1: ‘b’,
    2: ‘c’,
    length: 3,
    [Symbol.iterator]: Array.prototype[Symbol.iterator]
    };
    for (let item of iterable) {
    console.log(item); // ‘a’, ‘b’, ‘c’
    }
  • 默认调用itertor接口
    (1)解构赋值
    对数组或者set数据结构进行解构时:
    var arr=[‘a’,‘b’]
    var [x,y]=arr;
    x=“a”;
    y=“b”;
    var arr =new set().add(‘a’).add(‘b’).add(‘c’);
    var [x,…y]=arr;
    x=‘a’;y=[‘b’,‘c’]
    (2)扩展运算符
    string arr=“dsafsa”
    […arr]=[‘d’,‘s’,‘a’,‘f’,‘s’,‘a’]
    只要某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。
    (3)yield*
    (4)其他场合
    for…of
    Array.from()
    Map(), Set(), WeakMap(), WeakSet()(比如new Map([[‘a’,1],[‘b’,2]]))
    Promise.all()
    Promise.race()
  • 计算生成的数据结构
  1. entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组。对于数组,键名就是索引值;对于 Set,键名与键值相同。Map 结构的 Iterator 接口,默认就是调用entries方法。
  2. keys() 返回一个遍历器对象,用来遍历所有的键名。
  3. values() 返回一个遍历器对象,用来遍历所有的键值。
    注意 :使用for…in 和for…of的区别
  • 循环方法对比
    for循环比较麻烦
    forEach比较简单,但是不能中途停止
    for…in 主要是为对象设计,也可遍历数组的键名,但是遍历的键名是字符串。
    for…of是最好的方法,能解决上面都没有的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值