Iterator 和 for...of 轮回

Iterator 和 for…of 轮回

Iterator(遍历器)意义

为Array、Object、Map、Set四种数据鸠合,供应一致的接口机制来处置惩罚一切差别的数据结构 。

任何数据结构,只需布置 Iterator 接口,就能够完成遍历操纵(即顺次处置惩罚该数据结 构的一切成员) 。

接口

//遍历器接口 
interface Iterable{
    [Symbol.iterator]():Iterator,
}
//指针对象
interface Iterator{
    next(value?:any):IterationResult,
}
//返回效果
interface IterationResult{
    value:any,
    done:boolean
}

生成器
Generator 函数的挪用要领与一般函数一样,也是在函数名背面加上一对圆括号。差别 的是 ,
挪用 Generator 函数后,该函数并不实行 , 返回的也不是函数运转效果 , 而是一个指 向内 部状况
的指针对象, 也就是上一章引见的遍历器对象 Iterator Object ) 。
挪用 Generator 函数返回一个遍历器对象,代表 Generator 函数的内部指针 。 以
后,每次挪用遍历器对象的 next 要领,就会返回 一个有着 value 和 done 两个属性的对象 。
value 属性示意当前的内部状况的值,是 yield 语句背面谁人表达式的值 : done 属性是一个
布尔值,示意是不是遍历完毕

作用

  1. 为种种数据结构供应一个一致 的、轻便的接见接口;
  2. 使得 数据结构的成员能够按某种序次分列;
  3. ES6 制造了 一种新的遍历敕令一for . . . of 轮回, Iterator 接口 重要供 for … of 消耗。

历程

  1. 建立一个指针对象,指向当前数据结构的肇端位置 。 也就是说,遍历器对象本质上就是 一个指针对象 。
  2. 第一次挪用指针对象的 next 要领,能够将指针指向数据结构的第 一个成员 。
  3. 第二次挪用指针对象的 next 要领,指针就指向数据结构的第二个成员 。
  4. 不停挪用指针对象的 next 要领,直到它指向数据结构的完毕位置 。

道理

每次挪用 next 要领都邑返回数据结构的当前成员的信息。具体来说,就是返回一个包含 value 和 done 两个属性的对象。个中, value 属性是当前成员的值, done 属性是一个布尔值

与其他遍历语法的比较

以数组为例, JavaScript 供应了多种遍历语法。最原始的写法就是 for 轮回 。

//贫苦
for (var index = 0; index < myArray.length ; index++) { 
    console.log(myArray[index]);  
} 
// 不能跳出
myArray.forEach(function (value) {
    console.log(value) ; 
})

//被设想用来遍历对象,而不是数组
for(let i in myArray){
    console.log(i)
}
//简约,可跳出,一致接口
for(let i of myArray){
    console.log(i)
}

//for ... of的等价写法
let iterator = myArray[Symbol.iterator]();
let item = iterator.next();
while(!item.done){
    console.log(item.value);
    item = iterator.next();
}

这类写法比较贫苦,因而数组供应了内置的 forEach 要领。

这类写法的问题在于,没法半途跳出 forEach 轮回, break 敕令或 return 敕令都不能 见效

for … in轮回能够遍历数组的键名。

for … in 轮回有几个瑕玷。

  • 数组的键名是数字,然则 for … in 轮回是以字符串作为键名,“0”、“ 1 ”、" 2 ”等。
  • for … in 轮回不仅能够遍历数字键名,还会遍历手动增加的其他键,以至包含原 型链上的键。
  • 某些情况下, for … in 轮回会以恣意递次遍历键名

总之, for . .. in 轮回重如果为遍历对象而设想的,不适用于遍历数组。

for … of 轮回比拟上面几种做法有一些明显的长处。

  • 有着同 for … in 一样的简约语法,然则没有 for … in 那些瑕玷。
  • 差别于 forEach 要领 , 它能够与 break 、 continue 和 return 合营运用 。
  • 供应了遍历一切数据结构的一致操纵接口。
    原文作者:下一个
    原文地址: https://segmentfault.com/a/1190000018163978
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞