15-可迭代协议&for-of

104 阅读1分钟

可迭代协议 与 for of 循环

可迭代协议

概念回顾

  • 迭代器(iterator): 一个具体next方法的对象,next方法返回下一个数据并且能指示是否迭代
  • 迭代器创建函数(iterator creator): 一个返回迭代器的函数

可迭代协议

ES6规定, 如果一个对象具有知名符号Symbol.iterator,并且属性值是一个迭代器创建函数,则该对象是可迭代的(iterable)

  • 瞎写一个可迭代对象
let obj = {
    [Symbol.iterator]() {
        return {
            next() {
                return {
                    value: 1,
                    done: false
                }
            }
        } 
    }
}
const arr = [1, 2, 3, 4];
const iterator = arr[Symbol.iterator]();
let result = iterator.next();
while(!result.done) {
  const item = result.value;// 取出数值
  console.log(item);
  // 下一次迭代
  result = iterator.next();
}

image.png

怎么知道一个对象是否是可迭代的? 如何遍历一个可迭代对象? [for-of]

for-of 循环

for-of 循环用于遍历可迭代对象,格式如下

for(let item in iterable) {
  // iterable 可迭代对象
  // item: 每次迭代得到的数据
}
  • 给对象加迭代属性
const obj = {
  a: 1,
  b: 2,
  [Symbol.iterator]() {
    const keys = Object.keys(this);
    let i = 0;
    return {
      next: () => {
        let propName = keys[i];
        let propvalue = this[propName];
        const result = {
          value: { propName, propvalue} ,
          done: i >= keys.length
        }
        i++;
        return result
      }
    }
  }
}

for(let item of obj) {
  console.log(item);
}

image.png

关于扩展运算符与迭代对象

展开运算符可以作用于可迭代对象,这样,就可以轻松的将可迭代对象转换为数组

const obj = {
  a: 1,
  b: 2,
  [Symbol.iterator]() {
    const keys = Object.keys(this);
    let i = 0;
    return {
      next: () => {
        let propName = keys[i];
        let propvalue = this[propName];
        const result = {
          value: { propName, propvalue} ,
          done: i >= keys.length
        }
        i++;
        return result
      }
    }
  }
}

const arr = [...obj];
console.log(arr);

image.png