Iterator接口 笔记

Iterator 的作用有三个:
一是为各种数据结构,提供一个统一的、简便的访问接口;
二是使得数据结构的成员能够按某种次序排列;
三是 ES6 创造了一种新的遍历命令 for...of 循环,Iterator 接口主要供 for...of 消费。

const obj = {
  [Symbol.iterator]: function () {
    return {
      next: function () {
        return {
          value: 1,
          done: true
        }
      }
    }
  }
}

console.log(obj)

const iterator = obj[Symbol.iterator]()

console.log(iterator)

console.log(iterator.next())

console.log(iterator.next())

for (let k of obj) {
  console.log(k)
}
12334242-bbca73533f8a4f8d.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/oQVWmQ

原生具备 Iterator 接口的数据结构如下

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象

Array

const arr = [1, 2, 3]

console.log(arr)
12334242-81d20cb022440d4b.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/BGbZQL

Map

const map = new Map()
const o = {a: 1}

map.set(o, 'content')
console.log(map.get(o))

console.log(map)
12334242-5d04d475c2eacbfb.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/JezJNz
http://es6.ruanyifeng.com/#docs/set-map#Map

Set

const set = new Set([1, 2, 3])

console.log(set)
12334242-0baf4ecc6f3ef1b3.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/aQMwKx
http://es6.ruanyifeng.com/#docs/set-map#Set

String

const str = new String('abc')

console.log(str)
12334242-c2ced6f64e3fc575.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/WYmOpj

TypedArray

const typedArray = new Int8Array(3)

console.log(typedArray)
12334242-26a87fcc0c7ae937.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/JezJKw

函数的 arguments 对象

function fn() {
  console.dir(arguments)
}

fn(1, 2, 3, 4)
12334242-04a8d5b59a4a700d.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/JezJmg

NodeList 对象

<p>1</p>
<p>2</p>

<script>
const ps = document.querySelectorAll('p')

console.log(ps)
</script>
12334242-2c506be49d3fcf32.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/rQRwPP

指针对象( 遍历器对象 )

12334242-b1de277e56e4e448.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/NEJzqV

const arr = [1, 2, 3]

const it = arr[Symbol.iterator]()

console.log(`console.log(it)`)
console.log(it)
12334242-ac66611dd1743c68.png
image.png
12334242-e59174a47bfd5e8e.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/aQMKjE

Error

Uncaught TypeError: Result of the Symbol.iterator method is not an object

const obj = {
  [Symbol.iterator]: function () {}
}

for (let k of obj) {
  console.log(k)
}
12334242-540ac552877fc43f.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/wQOxZq

Uncaught TypeError: undefined is not a function ( 找不到 next 方法 )

const obj = {
  [Symbol.iterator]: function () {
    return {}
  }
}

for (let k of obj) {
  console.log(k)
}
12334242-d65be426d55ebebb.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/gQEjVm

undefined

const obj = {
  [Symbol.iterator]: function () {
    return {
      next: function () {
        return {}
      }
    }
  }
}

for (let k of obj) {
  console.log(k)
  break
}

不写 break 语句的话,会无限循环。

12334242-46b080275feb6ba5.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/QJoVLr

let index = 0

const obj = {
  [Symbol.iterator]: function () {
    return {
      next: function () {
        if (index < 4) {
          console.log('执行了')
          index++
          return {
            value: 1,
            // done: false
          }
        } else {
          return {
            // value: undefined,
            done: true
          }
        }
      }
    }
  }
}

for (let k of obj) {
  console.log(k)
  // break
}
12334242-149408a4645593be.png
image.png

Codepen: https://codepen.io/MonguDykrai/pen/rQRZQV

for...of 循环结束的条件 next 的返回值包含 done: true

12334242-79cef3c8216a08a8.gif
for_of遍历结束的条件done_true1.gif

Codepen: https://codepen.io/MonguDykrai/pen/rQRZQV

参考资料:
http://es6.ruanyifeng.com/#docs/iterator

猜你喜欢

转载自blog.csdn.net/weixin_33869377/article/details/87641926