可迭代对象与类数组

505 阅读1分钟

可迭代对象

实现了 Iterator 接口的数据结构,即部署了 Symbol.Iterator 对象

遍历
  • while循环

    /** ITERABLE代表某种可遍历的数据结构,$iterator是它的遍历器对象。
    遍历器对象每次移动指针(next方法),都检查一下返回值的done属性,如果遍历还没结束,就移动遍历器对象的指针到下一步(next方法),不断循环
    */
    var $iterator = ITERABLE[Symbol.iterator]();
    var $result = $iterator.next();
    while (!$result.done) {
      var x = $result.value;
      // ...
      $result = $iterator.next();
    }
    
  • for...of

转化为数组
  • 扩展运算符

    扩展运算符(...)内部使用for...of循环,所以可以用于可迭代对象

    let set = new Set().add('a').add('b').add('c');
    ['a', ...set, 'd'] // ["a", "a", "b", "c", "d"]
    ​
    let map = new Map().set('a', 1).set('b', 2);
    [...map] // [["a", 0], ["b", 1]]
    
  • Array.from()

    将一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例

    let set = new Set().add('a').add('b').add('c');
    Array.from(set) // ["a", "b", "c"]let map = new Map().set('a', 1).set('b', 2);
    Arrary.from(map) // [["a", 0], [b", 1]]
    

类数组

存在数值键名和length属性

遍历
转化为数组
  • Array.from(arrLike)

  • 数组的slice方法 + call/ apply

    let arrLike = {
      0: 'a',
      1: 'b',
      2: 'c',
      length: 3
    };
    ​
    // call 改变this的指向
    Array.prototype.slice.call(arrLike)
    arrLike // ["a", "b", "c"]
    // 或者
    [].slice.call(arrLike)
    arrLike // ["a", "b", "c"]