总结的简单流程是:
(1)执行next后会从上往下依次返回每个yield表达式的值,
(2)如果next有传参的话,会整个覆盖掉将要返回当前yield的上一个yield,
(3)方法内的yield表达式和return都执行完了,就会直接返回undefined了。
所以它的流程才会是:
入参 分析结果
1 1(无论是否传参,传什么参数,返回第一个表达式的值1)
2 2(返回第二个表达式的值yield a,a=上一个yield表达式yield 1,被参数3覆盖,所以a=3)
4 4(返回第三个表达式的值yield b,b=上一个yield表达式yield a,被参数4覆盖,所以b=4)
5 11(返回return a+b+c,c=上一个yield表达式yield b,被参数5覆盖,所以c=5,也就是a+b+c=2+4+5=11)
新的遍历方法:entries(),keys()和values()
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
let a = [1,3,5].keys();
a; // 一个迭代器对象
a.next(); // {value: 0, done: false}
a.next(); // {value: 1, done: false}
a.next(); // {value: 2, done: false}
a.next(); // {value: undefined, done: true}
字符串的遍历:
for (let codePoint of 'qwertyuiop') {
console.log(codePoint);
}
给对象加遍历器:
var person={
name: 'zz',
age: 18
}
//给person对象添加一个iterator接口
person[Symbol.iterator] = function(){
//使用object.keys()方法把j对象中的k值读取出来存在数组当中
var arr = Object.keys(person);
var i = 0;
return {
//ES6中next()迭代方法,自动迭代
next(){
if(i < arr.length){
//如果done为false,继续迭代
return {
//返回迭代的最后结果,如果是一个对象,那么for of的时候需要用解构
value: {
k : arr[i],
val: person[arr[i++]]
},
done: false
}
}else{
//如果done为true,继续迭代
return {
value: null,
done : true
}
}
}
}
}
//解构获取返回得到的对象,输出k值,val值
for(var {key,val} of person){
console.log(key,val);
}