迭代器和生成器

一、迭代器

1.什么是迭代?

迭代就是一个数据集合中按照一定的顺序,不断去除数据的过程。

2.迭代和遍历的区别?

迭代强调的是依次取出数据,不能确定取出的数据有多少,也不能保证数据是否取完。

遍历则是保证数据的长度,循环不断的去除数据,针对数据量过大的时候会花费很多时间。

3.迭代器是什么?

对于迭代过程的封装,通常表现为对象的数据形式(也有数组的形式),在不同的语言中,表现出的形式是不一样的。

4.迭代器满足的条件是?

(1)有得到下一个数据的能力。

(2)判断是否有后续数据的能力。

js中的迭代器:

js规定,如果一个对象有next方法,并且返回一个对象,就认为该对象为迭代器。

const obj = {
    next(){
        return {
            value: xxx, //数据
            done : xxx //判断是否有后续数据的能力  一般为boolean
        }
    }
}

ES6之后数组对象Array就已经有迭代器的方法,可以直接使用。

在ES6后,如果对象原型上具有知名符号属性Symbol.iterator方法,则表示该对象可迭代。

注意:扩展运算符(...)的展开功能只能在可迭代对象上使用。

举个栗子:

 // 斐波拉切数列

        // 封装数组的迭代器函数
        function createIterator(){
            let i = 0
            let arr =[0,1]
            return {
                next(){
                    if(arr[i] === undefined){
                        arr.push(arr[i-1] + arr[i-2])
                    }
                    let result = {
                        value : arr[i],
                        done : false
                    }
                    i++;
                    return result;
                }
            }
        }

        let ite = createIterator()

二、生成器

1.什么是生成器?

生成器就是通过构造函数Genterator创建出来的对象,生成器就是一个迭代器,同时又是一个可迭代对象。

2.怎样创建生成器?

不可以使用new调用(new Generator() ×)。要使用*(星号)紧挨着函数名或者function 这样test函数就是一个生成器了。

function *test(){
    console.log("123");
    yield "a";
    console.log("123");
    console.log("123");
    yield "b";
    console.log("123");
    return "c";
}

const generator = test()
console.log(generator.next())

//123
//{value: 'a', done: false}

generator.next()
//123
//123
//{value: 'b', done: false}

generator.next()
//123
//{value: 'c', done: true}

生成器中的关键 yield 只能在函数的内部使用,表示一个可迭代数据。

使用next方法会返回一个对象,这个对象就是迭代器对象,对象当中的value就是yield后面的值。

3.生成器需要注意的点

1.生成器有返回值,出现在最后一次done为true的value值。

2.调用生成的next方法是,可以传递参数,传递的参数会交给yield表达式上的返回值。

3.第一调用next函数的时候,传递的参数是没有任何含义的。

对于生成器的应用再举一个栗子:

// 生成器 斐波拉契数列

        const arr = [0,1];
        function *feibo(arr){
            for (let i = 0;i<arr.length;i++) {
                let a = arr[i] + arr[i+1];
                arr.push(a);
                yield arr[i];
            }
        }
        let generator = feibo(arr) ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值