1,迭代器
let index = 0
const animal = ["cat", "dog", "fish"]
const iterator = {
next() {
if (index < animal.length) {
return {
done: false,
value: animal[index++],
}
} else {
return {
done: true,
value: undefined,
}
}
},
}
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
function myIterator(arr) {
let index = 0
return {
next() {
if (index < arr.length) {
return {
done: false,
value: arr[index++],
}
} else {
return {
done: true,
value: undefined,
}
}
},
}
}
const res = myIterator(["cat", "dog", "fish"])
console.log(res.next())
console.log(res.next())
console.log(res.next())
console.log(res.next())
2.可迭代对象
2.1.JS内置的原生可迭代对象
const str = "one"
const ite = str[Symbol.iterator]()
console.log(ite.next())
console.log(ite.next())
console.log(ite.next())
console.log(ite.next())
2.2.可迭代对象的实现/应用
const p1 = {
value: "abc",
[Symbol.iterator]: function () {
let index = 0
let _this = this
return {
next() {
if (index < _this.value.length) {
return {
done: false,
value: _this.value[index++],
}
} else {
return {
done: true,
value: undefined,
}
}
},
}
},
}
for (const iterator of p1) {
console.log(iterator)
}
2.3.类迭代的实现
class Person {
constructor(name, animal) {
this.name = name
this.animal = animal
}
[Symbol.iterator]() {
let index = 0
let _this = this
return {
next() {
if (index < _this.animal.length) {
return {
done: false,
value: _this.animal[index++],
}
} else {
return {
done: true,
value: undefined,
}
}
},
}
}
}
const p2 = new Person("p2", ["cat", "fish", "dog"])
for (const iterator of p2) {
console.log(iterator)
}
3.生成器函数
3.1.使用,单次执行,多次执行
function* run1() {
console.log("run1")
}
run1()
function* run2() {
console.log("run2")
}
const generator2 = run2()
console.log(generator2.next())
function* run3() {
console.log("run3 start")
yield 1
console.log("run3 run")
yield 2
console.log("run3 end")
return 3
}
const generator3 = run3()
console.log(generator3.next())
console.log(generator3.next())
console.log(generator3.next())
console.log(generator3.next())
3.2.分段传参
function* run(params) {
console.log(params)
const res1 = yield params
const res2 = yield res1 + params
return res2 + res1 + params
}
const generator = run("a")
console.log(generator.next())
console.log(generator.next("b"))
console.log(generator.next("c"))
console.log(generator.next())
3.3.生成器替代迭代器,类迭代,可迭代对象的终极封装
let animal = ["dog", "cat", "fish"]
function myIterator(params) {
let index = 0
return {
next() {
if (index < params.length) {
return { done: false, value: params[index++] }
} else {
return { done: true, value: undefined }
}
},
}
}
const iterator = myIterator(animal)
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
function* myIterator2(params) {
yield* params
}
const iterator2 = myIterator2(animal)
console.log(iterator2.next())
console.log(iterator2.next())
console.log(iterator2.next())
console.log(iterator2.next())
class Person {
constructor(name, animal) {
this.name = name
this.animal = animal
}
*[Symbol.iterator]() {
yield* this.animal
}
}
const A = new Person("a", ["cat", "fish", "dog"])
for (const iterator of A) {
console.log(iterator)
}
const p1 = {
value: "abc",
*[Symbol.iterator]() {
yield* this.value
},
}
for (const iterator of p1) {
console.log(iterator)
}
4.总结