js中迭代器和可迭代对象

一、迭代器

  • 在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol)

  • 迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式;

  • 在JavaScript中这个标准就是一个特定的next方法;

    next方法要求:next方法是一个无参数或者有一个参数的函数,返回结果应当拥有以下两个属性的对象:
    1、done(boolean) : done返回一个布尔值: 可能是false, 可能是true

    如果迭代器可以产生序列中的下一个值,则为 false。(这等价于没有指定 done 这个属性)
    如果迭代器已将序列迭代完毕,则为 true。这种情况下,value 是可选的,如果它依然存在,即这个值为迭代结束之后默认返回值。

    2、 value:value的返回值: 可能是一个具体的值, 可能是undefined.

    例如:

// 例如有两个数组
const nums = [10, 20, 30, 40]
const names = ["aaa", "bbb", "ccc", "ddd"]

// 封装一个用于创建迭代器的函数
function createArrayIterator(arr) {
    
    
  let index = 0
  return {
    
    
    next: function() {
    
    
      if (index < arr.length) {
    
    
        return {
    
     done: false, value: arr[index++] }
      } else {
    
    
        // value不写, 默认就是undefined
        return {
    
     done: true }
      }
    }
  }
}

// 调用函数创建nums构造器
const numsIterator = createArrayIterator(nums)
console.log(numsIterator.next()) // {done: false, value: 10}
console.log(numsIterator.next()) // {done: false, value: 20}
console.log(numsIterator.next()) // {done: false, value: 30}
console.log(numsIterator.next()) // {done: false, value: 40}
console.log(numsIterator.next()) // {done: true}

// 调用函数创建names构造器
const namesIterator = createArrayIterator(names)
console.log(namesIterator.next()) // {done: false, value: 'aaa'}
console.log(namesIterator.next()) // {done: false, value: 'bbb'}
console.log(namesIterator.next()) // {done: false, value: 'ccc'}
console.log(namesIterator.next()) // {done: false, value: 'ddd'}
console.log(namesIterator.next()) // {done: true}

二、什么是可迭代对象:

1.有[Symbol.iterator] 这个属性;
2.调用这个[Symbol.iterator] 属性(方法)需要返回一个迭代器。

三、原生迭代器对象
事实上我们平时创建的很多原生对象已经实现了可迭代协议,会生成一个迭代器对象的:

比如 : String、Array、Map、Set、arguments对象、NodeList集合;

我们可以看一下:

定义一个数组:

let arr =[1,2,3]

其中调用arr[Symbol.iterator]()会返回数组的迭代器

在这里插入图片描述

调用迭代器的next()方法会返回应当拥有以下两个属性的对象:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42931285/article/details/132530732
今日推荐