ES6
迭代器
迭代器就是为实现对不同集合进行统一遍历操作的一种机制,只要给需要遍历的数据结构部署Iterator接口,通过调用该接口,或者使用消耗该接口的API实现遍历操作。
ES6为迭代器引入了一个隐式的标准化接口。Javascript许多内建的数据结构,例如Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象都具备 Iterator 接口。
Iterator接口主要为for of 使用,for of(遍历的是value
) 不同于for in(遍历的是key)
const arr = [4, 3, 2, 1];
for (let v of arr) {
console.log(v); // 4 3 2 1
}
可以通过在控制台打印一个Array实例,查看其原型上具有一个Symbol.iterator属性(Symbol.iterator其实是Symbol(‘Symbol.iterator’)的简写,属性名是Symbol类型代表着这个属性的唯一以及不可重写覆盖),它就是迭代器函数,执行这个函数,就会返回一个迭代器对象,对象下有一个next()方法。
next()迭代
在获得数组最后一位元素的时候,迭代器不会报告done:true,这时候需要再次调用next(),越过数组结尾的值,才能得到完成信号done:true。
通常情况下,在已经迭代完毕的迭代器对象上继续调用next方法会继续返回{value: undefined, done: true}而不会报错。
实现自定义遍历的数据
自定义遍历obj的list数据,而非obj
const obj = {
name: 'gg',
list: ['a', 'b', 'c', 'd', 'e'],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.list.length) {
const result = {
value: this.list[index], done: false };
index++;
return result;
} else return {
value: undefined, done: true };
}
};
}
};
for (let v of obj) {
console.log(v);
}
生成器
生成器就是一个特殊的函数,是针对于异步编程一个新的解决方案。function 和函数名之间加个 *
返回的是一个迭代器对象 可以使用next() 方法调用
yield 函数代码的分隔符
function* gen() {
console.log('1');
yield 'a'; // 函数代码的分隔符
console.log('2');
yield 'b';
console.log('3');
yield 'c';
}
let iterator = gen(); // 返回的是一个迭代器对象 可以使用next() 方法调用
iterator.next(); // 1
iterator.next(); // 2
iterator.next(); // 3
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
迭代器对象 即可使用for of
输出的为yield后面的代码
function* gen() {
yield 'a'; // 函数代码的分隔符
yield 'b';
yield 'c';
}
for (let v of gen()) {
console.log(v); // a b c
}
生成器传递参数
next()方法传递的参数将作为上一个yield的返回值
function* gen(arg) {
console.log(arg);
let one = yield 111;
console.log(one);
let two = yield 222;
console.log(two);
let three =