一、迭代器
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) ;