生成器函数:被调用函数的函数体不会马上执行而是返回一个包含next方法的对象。
1、返回一个对象,对象中包含一个next方法
2、next方法返回一个对象,该对象包含一个value属性和一个done标记属性
3、阻止函数的内部执行,通过调用next方法执行下一步,直到执行到下一个yield
function * ge(){
console.log(123);
}
let nextObj=ge()
console.log("还没调用next方法");
console.log(nextObj.next());
function * myGenerator(){
console.log("我要打印1了");
yield "1"
console.log("我要打印2了");
yield "2"
}
console.log("*****0****");
let mg=myGenerator();
console.log("*****1****");
console.log(mg.next());
console.log("*****2****");
console.log(mg.next());
console.log("*****3****");
输出结果:
迭代器函数:所有实现[Symbol.iterator] 方法的对象都可以使用for ...of枚举对象的属性。
函数特点:
1、返回一个对象,对象中包含一个next方法
2、next方法返回一个对象,该对象包含一个value属性和一个done标记属性。
实现代码:
function myIterator() {
let count = 0,
keys = Object.entries(this),
len = keys.length;
return {
next() {
let value = keys[count++]
return {
value: value ? value[1] + "my" : undefined,
done: value ? false : true
};
}
}
};
var obj = {
a: 1,
b: 2,
c: 4
};
var arr = [3, 4, 5]
var str = "abc"
obj[Symbol.iterator] = myIterator;
Array.prototype[Symbol.iterator] = myIterator;
String.prototype[Symbol.iterator] = myIterator;
for (var k of obj) {
console.log(k);
}
for (var k of arr) {
console.log(k);
}
for (var k of str) {
console.log(k);
}
输出结果:
生成器函数实现迭代器:
function* generator() {
let keyValues = Object.entries(this),
len = keyValues.length;
for (let i = 0; i < len; i++) {
yield keyValues[i][1] + "*my"
}
};
obj[Symbol.iterator] = generator;
Array.prototype[Symbol.iterator] = generator;
String.prototype[Symbol.iterator] = generator;
for (var k of obj) {
console.log(k);
}
for (var k of arr) {
console.log(k);
}
for (var k of str) {
console.log(k);
}
输出结果: