ES6中的迭代器和生成器

1、迭代器

是被设计为专用于迭代的对象,带有特定的接口。所有的迭代器对象都拥有next()方法,迭代器持有一个指向集合位置的内部指针,每当调用了 next() 方法,迭代器就会返回相应的下一个值。

2、生成器

生成器是能返回一个迭代器的函数,生成器函数放在 function 关键字之后的一个星号( * ) 来表示,并且能使用新的 yield 关键字。星号紧跟在 function 关键字之后,或者在中间留出空格.。
例如这样:

function *cit(){
yield 1;
yield 2;
yield 3;
}
let it = cit();
console.log(it.next().value); //1
console.log(it.next().value); //2
console.log(it.next().value); //3
console.log(it.next().value); //undefined

生成器函数会在每一个 yield 语句后停止,例如在上面的代码中执行 yield 1后,该函数不会在继续往下执行。等待下一次调用 next() 后,才会继续往下执行 yield 2。

3、可迭代对象与for循环

let arr = [1,2,3];
for(let num of arr){
console.log(num); //1,2,3
}

访问可迭代对象的默认迭代
for-of循环首先会调用arr数组中Symbol.iterator属性对象的函数,就会获取到该数组对应的迭代器,接下来iterator.next()被调用,迭代器结果对象的value属性会被放入到变量num中。数组中的数据项会依次存入到变量num中,直到迭代器结果对象中的done属性变成true为止,循环结束。

let arr = [1,2,3];
//访问默认迭代器
let iterator = arrSymbol.iterator;
console.log(iterator.next().value); //1
console.log(iterator.next().value); //2

4、内置的迭代

ES6中有三种集合对象:数组、Map和Set,这三种类型都拥有默认的迭代器:

a、entries():返回一个包含键值对的迭代器;
b、values():返回一个包含集合中的值的迭代器;
c、keys():返回一个包含集合中的键的迭代器;

1、调用entries()迭代器会在每次调用next()方法返回一个双项数组,此数组代表集合数据项中的键和值:对于数组来说,第一项是数组索引;对于Set来说,第一项是值(因为Set的键和值相同),对于Map来说,就是键值对的值;
2、values()迭代器能够返回集合中的每一个值;
3、keys()迭代器能够返回集合中的每一个键;

集合的默认迭代器

当for-of循环没有显式指定迭代器时,集合对象会有默认的迭代器。values()方法是数组和Set默认的迭代器,而entries()方法是Map默认迭代器。

字符串的迭代器

//字符串默认迭代器
let str ='A   B';
for(let s of str){
    console.log(s); //A  B
}

扩展运算符与非数组的可迭代对象

扩展运算符能作用于所有可迭代对象,并且会使用默认迭代器来判断需要哪些值。在数组字面量中可以使用扩展运算符将可迭代对象填充到数组中。

//扩展运算符可作用到所有可迭代对象
//案例一
let arr = [1,2,3];
let array = [...arr];
console.log(array); [1,2,3]

//案例二
let arr = [1,2,3];
let arr2 = [7,8,9];
let array = [...arr,5,...arr2];
console.log(array); //1,2,3,5,7,8,9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值