何为可迭代对象

  1. // obj为可迭代对象
  2. let obj = {
  3. [Symbol.iterator]() {
  4. return {
  5. next() {
  6. return {
  7. value: "值",
  8. done: "判断是否还有后续数据的能力",
  9. }
  10. }
  11. }
  12. }
  13. }

此处代码中对象obj就为可迭代对象看下面的可迭代协议

可迭代协议

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

拿数组为例子
image.png

如何判断对象是否为可迭代的 该对象拥有符号属性中的Symbol.iterator 然后看该符号属性是否为个函数如上图

如何遍历可迭代对象

for-of循环

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

  1. //迭代完成后循环结束
  2. for(const item in iterable){
  3. //iterable:可迭代对象
  4. //item:每次迭代得到的数据
  5. }

如例:

  1. const arr = [1,2,3,4,6]
  2. const iterator = arr[Symbol.iterator]();
  3. let result = iterator.next();
  4. while(!result.done){
  5. console.log(result.value);
  6. result = iterator.next()
  7. }
  8. // 等效于 for-of
  9. for (const iterator of arr) {
  10. console.log(iterator)
  11. }

类数组可以使用当其为对象的时候就会出问题

  1. const obj = {
  2. n1: 1,
  3. n2: 2,
  4. n3: 3,
  5. }
  6. for (const iterator of obj) {
  7. console.log(iterator)
  8. }

image.png
你会发现对象不是一个可迭代的 查看其proto
image.png
对象并没有符号属性中的Symbol.iterator 可以自己添加以此实现对象的迭代

  1. const obj = {
  2. n1: 1,
  3. n2: 2,
  4. n3: 3,
  5. [Symbol.iterator](){
  6. const keys = Object.keys(this)
  7. let i = 0;
  8. return{
  9. next:() =>{
  10. const propName = keys[i];
  11. const propValue = this[propName];
  12. // console.log(this[propName])
  13. const result = {
  14. value: {
  15. propName,
  16. propValue
  17. },
  18. done: i >= keys.length,
  19. }
  20. i++
  21. return result;
  22. }
  23. }
  24. }
  25. }
  26. for (const item of obj) {
  27. console.log(item)
  28. }

展开运算符与可迭代对象

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