可迭代对象.png
迭代器与迭代对象关系.png
1.获取迭代器
let arr = [1, 2, 3];
//获取迭代器
let itr = arr[Symbol.iterator]();
console.log(itr.next()); //{ value: 1, done: false }
console.log(itr.next()); //{ value: 2, done: false }
console.log(itr.next()); //{ value: 3, done: false }
console.log(itr.next()); //{ value: undefined, done: true }
2.如何创建可迭代对象
①具有键值为Symbol.iterator的方法,返回一个可迭代对象
②对象字面量要拥有next()方法
let obj = {
start: 1,
end: 5
}
obj[Symbol.iterator] = function() {
const iterator = {
next() {
if (obj.start <= obj.end) {
return {
value: obj.start++,
done: false
}
} else {
return {
value: undefined,
done: true
}
}
}
}
return iterator;
}
for (const item of obj) {
console.log(item); //1 2 3 4 5
}
生成器:
生成器.png
生成器函数特点.png
//yeild 使用方法 可暂停
let genFunction = function*() {
console.log(1);
yield "yeild value";
console.log(2);
yield;
console.log(3);
}
let genObj = genFunction();
console.log(genObj.next()); // 1 { value: 'yeild value', done: false }
console.log(genObj.next()); // 2 { value: undefined, done: false }
console.log(genObj.next()); // 3 { value: undefined, done: true }
//迭代器与生成器一起使用
let obj = {
start: 1,
end: 5,
[Symbol.iterator]: function*() { //*[Symbol.iterator]() {
for (let index = obj.start; index <= obj.end; index++) {
yield index;
}
}
}
for (const item of obj) {
console.log(item); // 1 2 3 4 5
}
//当在递归函数或被另一个生成器函数调用的时候,使用yeild*语法
function* gen1() {
console.log("hello world");
}
function* gen2() {
// const gen = gen1();
// gen.next();
//以上代码可优化为
yield* gen1();
}
const g2 = gen2();
g2.next(); // hello world
生成器面试题1.png
生成器面试题2.png
内存管理&垃圾回收
内存管理.png
垃圾回收.png
标记清除
image.png









网友评论