ECMAScript-迭代器

一、ECMAScript-迭代器-Iterator
1. Iterator接口
  • Iterator是一种接口机制,为各种不同的数据结构提供统一访问的机制
  • 主要供for…of 消费
  • 让不支持遍历的数据结构 “可遍历”
// 举例
function makeIterator(arr) {
    let nextIndex = 0
    return {
        next() {
            return nextIndex < arr.length ? {
                value: arr[nextIndex++],
                done: false
            }: {
                value: undefined,
                done: true
            }
        }
    }
}

let it = makeIterator(['a', 'b', 'c'])
console.log(it.next()) // {value: "a", done: false}
console.log(it.next()) // {value: "a", done: false}
console.log(it.next()) // {value: "a", done: false}
console.log(it.next()) // {value: undefined, done: true}

// 数组自带的Symbol.iterator
let arr = ['a', 'b', 'c']
let it = arr[Symbol.iterator]()
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())

// map也自带Symbol.iterator
let map = new Map()
map.set('name', 'es')
map.set('age', 5)
map.set('school', '清华')
let it = map[Symbol.iterator]()
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
2. 原生具备Iterator接口的数据结构
  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的arguments对象
  • NodeList对象
3. 对不具备Iterator接口的数据结构,想实现可遍历
  • 可迭代协议:Symbol.iterator
  • 迭代器协议:return { next() {return {value, done}}}
// 取数组中的值
let courses = {
    allCourse: {
      frontend: ['ES', '小程序', 'Vue', 'React'],
      backend: ['Java', 'Python', 'SpringBoot'],
      webapp: ['Android', 'iOS']
    }
}
courses[Symbol.iterator] = function() {
    let allCourse = this.allCourse
    let keys = Reflect.ownKeys(allCourse)
    let values = []
    return {
        next() {
            if (!values.length) {
                if(keys.length) {
                    values = allCourse[keys[0]]
                    keys.shift()
                }        
            }
            return {
                done: !values.length,
                value: values.shift()
            }
        }
    }
}

for (let c of courses) {
    console.log(c)
}

// generator实现方式
courses[Symbol.iterator] = function* () {
    let allCourse = this.allCourse
    let keys = Reflect.ownKeys(allCourse)
    let values = []
    while (1) {
        if (!values.length) {
            if(keys.length) {
                values = allCourse[keys[0]]
                keys.shift()
                yield values.shift()
            } else {
                return false
            }  
        } else {
            yield values.shift()
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值