js迭代器和生成器的运用,迭代语句有哪些
这篇文章带给你一些关于javascript的知识,主要是关于迭代器的知识。迭代是指按照一定的顺序从数据集中连续提取数据的过程。下面就来看看吧,希望对你有帮助。
【相关推荐:javascript视频教程,web前端】
迭代是指按照一定的顺序从数据集连续取数据的过程。
那么迭代和遍历有什么区别呢?
迭代强调的是依次取数的过程,并不保证所有的数据都会被取到。遍历强调所有的数据都应该在JavaScript中依次取出。Iterator是一个可以调用下一个方法进行迭代的对象,它返回一个具有两个属性的对象。
value:iterable对象的下一个值,done:表示是否已经获取了所有数据。True表示仍有数据,true表示没有留下任何数据。
迭代器简单使用
通过迭代器工厂函数Symbol.iterator在可迭代对象中生成迭代器。
const arr=[]console.log(arr)
const arr=[1,2,3]
constiter 1=arr[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。
console.log(iter1)
console.log(iter1.next())
console.log(iter1.next())
console.log(iter1.next())
console.log(iter1.next())
console.log(%c%s , color:red; font-size:24px;, ================)
const mymap=新地图()
mymap.set(name , clz )
mymap.set(年龄,21)
constiter 2=mymap[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。
console.log(iter2)
console.log(iter2.next())
console.log(iter2.next())
console.log(iter2.next())
可以发现是在迭代器是取完的最后一个值之后完成的,也就是迭代器的下一个值未定义的时候。
但是上面的语句不是很准确,在迭代器的下一个值未定义的情况下没有完成。还需要确定是否真的没有值,或者在iterable对象中是否有未定义的值。如果iterable对象中有undefined值,则此时不会完成。
const arr=[1,2,3,未定义]
constiter 1=arr[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。
console.log(iter1)
console.log(iter1.next())
console.log(iter1.next())
console.log(iter1.next())
console.log(iter1.next())
console.log(iter1.next())
不同迭代器之间互不干扰
迭代器工厂函数可以多次调用,生成多个迭代器,每个迭代器代表一个可迭代对象的一次性有序遍历。不同迭代器之间互不干扰,只会独立地遍历可迭代对象。
const arr=[1,2,3]
constiter 1=arr[Symbol.iterator]()//通过迭代器工厂函数“symbol . iterator”生成迭代器。
const ITER 2=arr[symbol . iterator]()
Console.log (iterator 1:,iter1.next())
Console.log (iterator 2:,iter2.next())
Console.log (iterator 1:,iter1.next())
Console.log (iterator 2:,iter2.next())
迭代器对象可作为可迭代对象
const arr=[1,2,3]
const iter=arr[Symbol.iterator]()
for(ITER的常数I){
Console.log(i) //依次输出1、2、3
}
迭代器"与时俱进"
如果iterable对象在迭代过程中被修改,那么迭代器得到的结果也会被修改。
const arr=[1,2,3]
console.log(arr)
const iter=arr[Symbol.iterator]()
console.log(iter.next())
arr[1]=999
console.log(iter.next())
console.log(iter.next())
完成但并不完成
当我们迭代到done: true时,调用next会报错还是不返回任何东西?
然而,事实并非如此。迭代器将处于完成但并不完成的状态。done: true表示完成了,但是后续总是可以调用next,虽然结果永远是{value: undefined,done: true}。所以我们说完成但并不完成。
const arr=[1,2,3]
const iter=arr[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
自定义迭代器
从上面的例子我们可以知道是通过通过迭代器工厂函数 Symbol.iterator来生成迭代器,所以我们需要实现一个迭代器迭代器工厂函数,然后迭代器可以调用next方法,所以我们还需要实现一个next方法。至于迭代器工厂函数,我们实际上直接返回实例this。
计数器的示例:
类别计数器{
构造器(限制){
this.count=1
this.limit=limit }
下一个(){
if (this.count=this.limit) {
返回{
done: false,
值:this.count
}
}否则{
返回{ done: true,value: undefined }
}
}
[Symbol.iterator]() {
归还这个
} }常量计数器=新计数器(3)
const ITER=counter[symbol . iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
乍一看没有问题,但是如果用for-of来遍历,就能发现问题。
const Counter=new Counter(3)for(let I of Counter){
Console.log(i)}console.log(另一个迭代:)for (let i of counter) {
console.log(i)}
for-of循环的使用也变成了一次性的。这是因为count是这个实例的变量,所以它是两次迭代中使用的同一个变量。但是,在第一次循环之后,这个变量已经超过了极限,所以再次使用for-of循环也无法得到任何结果。
您可以将count变量放在闭包中,然后通过闭包返回迭代器,这样创建的每个迭代器都会对应一个新的计数器。
类别计数器{
构造器(限制){
this.limit=limit }
[Symbol.iterator]() {
让count=1
const limit=this.limit返回{
//迭代器工厂函数必须用next方法返回一个对象,因为迭代实际上是通过调用next方法实现的。
下一个(){
if(计数=限制){
返回{
done: false,
值:计数
}
}否则{
返回{ done: true,value: undefined }
}
}
}
}}测试
const Counter=new Counter(3)for(let I of Counter){
Console.log(i)}console.log(另一个迭代:)for (let i of counter) {
console.log(i)}
提前终止迭代器
就像使用for-of循环一样,迭代器会足够智能地调用下一个方法,当迭代器提前终止时,也会调用返回方法。
[Symbol.iterator]() {
让count=1
const limit=this.limit返回{
//迭代器工厂函数必须用next方法返回一个对象,因为迭代实际上是通过调用next方法实现的。
下一个(){
if(计数=限制){
返回{
done: false,
值:计数
}
}否则{
返回{ done: true,value: undefined }
}
},
return()
Console.log(提前终止迭代器)
返回{ done: true }
}
}}测试
const Counter=new Counter(5)for(let I of Counter){
if (i===3) {
打破;
}
console.log(i)}
如果迭代器没有关闭,就可以继续从上次离开的地方继续迭代。不能关闭数组迭代器。
const arr=[1,2,3,4,5]const ITER=arr[symbol . iterator]()ITER . return=function(){
Console.log(提前退出迭代器)
返回{
完成:正确
} } for(ITER的常量I){
console.log(i)
if (i===2) {
破裂
} } for(ITER的常量I){
console.log(i)}
【相关推荐:javascript视频教程,web前端】以上是JavaScript迭代器知识点总结的详细内容。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。