可迭代对象

  • 1、什么与可迭代对象有关
  • 2、概念
  • 3、语法(一个对象如何变成可迭代的对象 即 可以使用for of循环)
  • 4、数组的迭代
  • 5、实现一个数组的[Symbol.iterator]



1、什么与可迭代对象有关

场景1、可迭代对象离不开: for of, for of 就是专门为了循环可迭代对象
场景2、js中数组就是一个可迭代对象
场景3、vue中如果某个数组数据变化,有用到for of的地方是不是得重新执行?

2、概念

1、es2015定义了迭代协议,它不是一种语法而是一种协议

2、一个对象是否可迭代,取决于该对象或者该对象的原型上是否实现了@@iterator方法 => 这里的@@[name]标志,在ecmascript规范里用来代指javascript内建的symbols值 demo: @@iterator指的就是Symbol.iterator这个值

3、如果一个对象实现了Symbol.iterator方法,那么这个对象就是可迭代的

3、语法(一个对象如何变成可迭代的对象 即 可以使用for of循环)

下面的代码,可以放到vscode中断点一下,理解一下过程。

对过程进行一个描述(不想自己断点,看下面描述):
1、先空转一圈读一下
2、正式开始"循环"读,进到next里,++为1,false。打印原始值0
3、接着往下循环,++为2,false,打印原始值2 4、接着往下循环,++为3,true,不打印了

const iteratorObj = {
  value: 0,
  [Symbol.iterator]() {
    return {
      next() {
        return {
          value: iteratorObj.value++,
          done: iteratorObj.value > 2 ? true: false
        }
      }
    }
  }
}

for (const iterator of iteratorObj) {
  console.log(iterator)
}

// 会打印 0,1

4、数组的迭代

let arr = [1,2,3,4,5]

const item = arr[Symbol.iterator]()
console.log(item.next()) // { value: 1, done: false }
console.log(item.next()) // { value: 2, done: false }
console.log(item.next()) // { value: 3, done: false }
console.log(item.next()) // { value: 4, done: false }
console.log(item.next()) // { value: 5, done: false }
console.log(item.next()) // { value: undefined, done: true }

5、实现一个数组的[Symbol.iterator]

感觉有点复杂的话,你就假设arrray1为[1]

// 实现一下数组的迭代器
const array1  = [1,2,3]
array1[Symbol.iterator] = function() {
  const target = this;
  const len = target.length
  let index = 0
  return {
    next() {
      return {
        value: index < len ? target[index] : undefined,
        done: index++ >= len
      }
    }
  }
}
const I = array1[Symbol.iterator]()
console.log(I.next())//{ value: 1, done: false }
console.log(I.next())//{ value: 2, done: false }
console.log(I.next())//{ value: 3, done: false }
console.log(I.next())//{ value: undefined, done: true }