1、ES6迭代器描述

  • 迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。
  • 迭代器是用于遍历数据结构元素的指针(如数据库中的游标)

以下是可迭代的值:

  • Array
  • String
  • Map
  • Set
  • Dom元素(正在进行中)
  1. // 数组
  2. for (let item of ["zero", "one", "two"]) {
  3. console.log(item);
  4. }
  5. // zero
  6. // one
  7. // two
  8. // 字符串
  9. for (const c of 'z\uD83D\uDC0A') {
  10. console.log(c);
  11. }
  12. // z
  13. // \uD83D\uDC0A
  14. //map
  15. const map = new Map();
  16. map.set(0, "zero");
  17. map.set(1, "one");
  18. for (let item of map) {
  19. console.log(item);
  20. }
  21. // [0, "zero"]
  22. // [1, "one"]
  23. // set
  24. const set = new Set();
  25. set.add("zero");
  26. set.add("one");
  27. for (let item of set) {
  28. console.log(item);
  29. }
  30. // zero
  31. // one
  32. // arguments
  33. function args() {
  34. for (let item of arguments) {
  35. console.log(item);
  36. }
  37. }
  38. args("zero", "one");
  39. // zero
  40. // one

普通对象报错

  1. // TypeError 普通对象报错
  2. for (let item of {}) {
  3. console.log(item);
  4. }

2、如何让对象使用迭代器功能(Symbol.iterator)

  1. var obj = {
  2. a:1,
  3. b:2
  4. }
  5. Object.defineProperty(obj,"Symbol.iterator",{
  6. enumerable:false,
  7. writable:false,
  8. configurable:false,
  9. value:function(){
  10. var o = this
  11. var idx = 0
  12. var keys = Object.keys(obj)
  13. return {
  14. next:function(){
  15. return {
  16. value:o[keys[idx++]],
  17. done:(idx>keys.length)
  18. }
  19. }
  20. }
  21. }
  22. })
  23. var iterator = obj["Symbol.iterator"]()
  24. iterator.next()