迭代器与生成器这一章节还没有看的恨透,只把这一章节的例子全看完了,也看懂了。但是自己写不出这样优秀的代码。这是我缺少的技能。
//迭代器(Iterator)和生成器(Generator)
// 迭代器是一种特殊对象
//所有的迭代器都有一个next()方法,每次调用都返回一个结果对象。结果对象有两个属性:一个是值,表示下一个将要返回的值;另一个是完成,它是一个布尔类型的值,当没有更多可以返回数据时返回true
// es5仿制一个迭代器
/ * function createInterator(items ){
var i = 0;
return {
next:function(){
var done =(i> = items.length);
var value =!完成?items [i ++]:undefined;
return {
done:done,
value:value
};
}
}
}
VAR迭代= createInterator([1,2,3]);
console.log(iterator.next())//“{value:1,done:false}”* /
//生成器是一种返回迭代器的函数
//通过功能关键字后的星号(*)来表示,函数中会用到新的关键字yield。//
生成器
//也可以给函数传递一个数组项目循环生成yield items [i]
/ * function * createInterator(){
yield 1;
产量2;
产量3;
}
//生成器的调用方式与普通函数相同,只不过返回的是一个
迭代器 let iterator = createInterator();
的console.log(iterator.next()); // 1 * /
// yield关键字只可在生成器内部使用,在其他地方会导致程序抛出语法错误
//它与返回关键字一样,二者都不能穿透函数的边界。//
不能用箭头函数创建生成器
//可迭代对象和for-of循环
//可迭代对象具有Symbol.iterator属性,是一种与迭代器密切相关的对象
//由于生成器默认会为Symbol.iterator属性赋值,因此所有通过生成器创建的迭代器都是可迭代对象
/ * let values = [1,2,3];
for(let item of values){
console.log(item)
} * /
//访问默认的
迭代器对象//可以用Symbol.iterator属性,来检测是否为可迭代对象
// console.log(values [Symbol.iterator]())
内建迭代器
数组,Map集合和Set集合都内置了三种迭代器
1. entries()返回一个迭代器,其值为多个键值对
2. values() 返回一个迭代器,其值为集合的值
3. keys()返回一个迭代器,其值为集合中的所有键名
let values = [1,2,3]
console.log(values )
entries()迭代器其他迭代器类似
let colors = ['red','yellow','green'];
let tracking = new Set([1234,45678,9012]);
let data = new Map();
data.set(“title”,“了解ECMAScript 6”);
data.set(“format”,“ebook”);
for(输入colors.entries()){
console.log(entry);
}
for(let entry of entry.entries()){
console.log(entry);
}
for(输入data.entries()){
console.log(data);
}
在for-of循环中,如果没有显示的指定则使用默认的
迭代器//数组和Set集合的默认迭代器是values()方法
Map集合的迭代器默认的是entries( )方法
字符串迭代器这个和深入理解es6中的结果不一样(我在浏览器端尝试的)
let str =“a机b”;
for(let i = 0; i <str.length; i ++){
console.log(str [i])
}
高级迭代器的功能
function * createInterator(){
let first = yield 1;
让second = yield first +2; // 4 + 2
产生第二+ 3; // 5 + 3
}
let iterator = createInterator();
的console.log(iterator.next()); // 1 ...
console.log(iterator.next(4)); // 6 ...
console.log(iterator.next(5)); // 8 ...
console.log(iterator.next());
由于第一次调用next()方法时,无论传入什么值都是输出1
如果给迭代器的next( )传入参数,则这个参数会替代生成上一条得到语句的返回值
function run(taskDef){
创建一个无限使用限制的
迭代器 let task = taskDef();
//开始执行任务
let result = task.next();
循环调用next()函数
function step(){
如果任务未完成,则继续执行
if(!result.done){
result = task.next(result.value);
next();
}
}
开始迭代执行
step();
}
run(function *(){
let value = yield 1;
console.log(value);
value=value+3;
console.log(value);
})* /