es6迭代器

迭代器:

迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。(可以粗糙理解为遍历器)

原理:

数组中 迭代器的this(指针), 每次指向下一个索引

Map Set 会把临接链表 转化成一个单项链表 指针每次指向一个节点。指针下移

有默认的iterator接口:(都可以迭代的)Array Map Set String NodeList arguments

数组迭代器原理: 

let arr = [1, 2, 3]
function createIterator(arr) {
    let nextIndex = 0;
    return {
        next() {     //对象函数简写
            if (arr.length - 1 < nextIndex) { //数组长度 length-1 (从1和从0的区别)
                return {
                    value: undefined,
                    done: true
                }
            } else {
                return {
                    value: arr[nextIndex++],
                    done: false
                }
            }
        }
    }
}

以上代码,每次执行一次next() 方法 都会遍历出数组中的一位数。

 entries 迭代器 对于数组返回 [index,value] ,Map 返回[key,value] ,Set 返回 [key,key]

let arr = [1, 2, 3];
let map = new Map([['name', 'xxx'], ['age', 18]])
let set = new Set([1, 2, 3])
//entries 迭代器 对于数组返回 [index,value] ,Map 返回[key,value] ,Set 返回 [key,key]
let arrEntries = arr.entries();
let mapEntries = map.entries();
let setEntries = set.entries();
for (let item of arrEntries) { //for of 的作用是遍历迭代器中的next方法
    console.log(item)
}
所有迭代器 都有symbol.iterator 属性 必须通过中括号形式访问。返回默认的迭代器
迭代必须是有序的
for (let item of arr) { //会默认调用arr[symbol.iterator]() =>arr.values()
    console.log(item)
}
for (let item of map) { //map[symbol.iter]
    console.log(item)
}

所有迭代器 都有symbol.iterator 属性 必须通过中括号形式访问。返回默认的迭代器。迭代必须是有序的

对象是不可迭代的

var obj = {}

obj[symbol.iterator]().next()  //报错  可以用for in  来遍历对象的属性和方法。

小知识点:String 有些是双字节  for in 遍历不出来 所以需要使用 for of 

生成器 Generator

用于生成迭代器

生成器是 函数 * yield   应用:异步函数同步化

function* demo() {
    yield 1;
    yield 2;
    yield 3;

}
let i = demo()
i.next()

第一次执行i.next()  输出结果为1  第二次执行 i.next() 输出结果是2 。。。。

function washHands() {
    console.log('刷牙');
    setTimeout(function () {
        demo.next('挤牙膏刷好了牙')
    }, 2000)

}
function peeling() {
    console.log('洗脸');
    setTimeout(function () {
        demo.next('洗掉一天的疲惫')
    }, 2000)
}
function eat() {
    console.log('晚安~');
    setTimeout(function () {
        demo.next('躺在舒服的床上,对世界说一声晚安~')
    }, 2000)
}

function* eatOrange() {
    let result = `${yield washHands()}${yield peeling()}${yield eat()}`
    console.log(result);
}
let demo = eatOrange()
demo.next();  //调用第一次的yield  参数代表上一次next的返回值 这里没有 所以没有返回值

//委托迭代器 yield*
//遍历数组和字符串
function* show(arr, string) {
    yield* arr;
    yield* string;
}
let i = show([1, 2, 3], '我喜欢你')
for (let item of i) {
    console.log(item)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值