电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解JS前端使用迭代器和生成器原理及示例

瀏覽:43日期:2022-06-01 09:30:01
目錄
  • 正文
  • for of 是干什么用的
  • 可迭代對象是什么?
  • 生成器和迭代器的關(guān)系。
  • 讓非迭代對象也可以使用for of 進行遍歷
  • for循環(huán)和for in的關(guān)系
  • 總結(jié)

正文

生成器和迭代器這兩個東西平時作為一個切圖仔,一直都沒有使用到。感覺是只有在面試之前才會的東西。面試過不了幾天,再次看這兩個詞一陣恍惚。

記憶力退化成這樣了么?最大的原因一定是用得少了。然后呢?就是沒有真正的理解它們。我對于它們的認知常常有下面這些:

1. 我常常把迭代器和生成器理解成完全不同的東西。

2. 我常常把for、forEach、map、reducefor of混為一談

3. 我常常把數(shù)組、類數(shù)組認為是可迭代對象

想來要真正的記住它,增加自己的武器庫,必須要弄明白這些東西才行。

我們首先是要搞明白什么for of是干什么用的。

業(yè)務代碼確實使用不上,但是如果不理解的話,等真到了可以使用的場景的時候,又是否真的能夠運用起來,甚至記起來呢?

for of 是干什么用的

所有人都知道一些概念for、forEach、map、reduce這些是可以遍歷數(shù)組的,for of是用于遍歷迭代對象的。如下:

const arr = [1, 2, 3]arr.forEach((item, index) => {   console.log(item) // 1, 2, 3    console.log(index) // 0, 1, 2})

而巧合的是for of也可以遍歷數(shù)組

for (let key of arr) {    console.log(key) // 1 2 3}

將arr改變?yōu)?code>const obj = { a: 1, b: 2, c: 3 }的時候,兩者都沒有遍歷出結(jié)果。

前者是沒有反應,后者會直接報錯:TypeError: obj is not iterable。翻譯一下,類型錯誤:obj 不是一個可迭代對象。

那么什么是可迭代對象呢?

可迭代對象是什么?

我們先來看看下面這個例子:

const itemLi1 = document.getElementByTagName("li")const itemLi2 = document.querySelectorAll("li")for(let key of itemLi1) {    console.log(item)}for(let key of itemLi2) {    console.log(item)}

也就是說HTMLCollectionNodeList是可以迭代對象。其他的可迭代對象有Array、map、set、string等等。如果說類數(shù)組的話,是不是迭代對象呢?

const arrLike = {  0: 1,  1: 2,  2: 3,  lenght: 3}for (let i = 0; i < arrLike.length; i++) {    console.log(arrLike[i]) // 1, 2, 3}for (let of arrLike) {    console.log(key) // uncachh TypeError: obj is not iterable}

for循環(huán)打印出了對應的結(jié)果,而for of 報錯了。類數(shù)組不是可迭代的的對象。這又是為什么呢?我們將類數(shù)組和HTMLCollection類型打印出來比較一下。

而類數(shù)組如下:

它們有一個明顯的不同,可迭代對象的原型鏈上面是包括Symbol.iterator的。而這個就是讓數(shù)組變成可迭代的根本原因。

也就是說,當目的對象的原型鏈上面包括Symbol.iterator的時候,它才是可迭代對象。

對象是無序的,無序的東西自然不可以迭代

這里使用到了Symbol類型,它在MDN上面的解釋就是用于生成全局唯一的變量。而可迭代對象就是它的使用場景。受它的啟發(fā),我們在業(yè)務當中,如果需要前端來生成一個唯一ID的時候,再次之前,通常都是創(chuàng)建一個UUID的函數(shù)來生成一個唯一ID。Symbol不用這么麻煩,直接使用就可以了。

由此可知,Array.prototype[Symbol.iterater]這個函數(shù)封裝了一些東西,使得for of可以將對象的元素給打印出來。

換一句話來說,就是Array.prototype[Symbol.iterater] = function() {}的執(zhí)行生成一個迭代器對象。

也就是說,當Object.prototype也有[Symbol.iterater]的方法的時候,for of也能夠遍歷它呢?我們來試試看吧。

Object.ptotoype[Symbol.iterator] = function value() {}

這不就是生成器的作用么?

生成器和迭代器的關(guān)系。

ES6給我提高了一個生成器的函數(shù)。既然叫做生成器,它生成的東西就是迭代器。

表現(xiàn)形式如下:

function * generation(iterableObject) {    for(let i = 0; i < iterableObject; i++) {yield iterableObject[i]    }}

*符號和yield關(guān)鍵字組成。

const iterator = generation([1, 2, 3]), 其執(zhí)行流程如下:

iterator.next() ==> { value: 1, done: false }

iterator.next() ==> { value: 2, done: false }

iterator.next() ==> { value: 3, done: false }

iterator.next() ==> { value: undefined, done: true }

到了第四次,value為undefined的時候,done為true(也就是說,當done為true的時候,value一定為undefined)。所以說,yield的作用有兩個:

  • 生成一個值,將該值封裝成一個對象,而這個對象是{ value: .., done: flase/true }這樣的形式。
  • 停下來

可以明顯的看出來,生成器有一個作用,通過next這個接口,可以看到迭代的過程。

既然說生成器生成了一個迭代器,那么是不是說生成器執(zhí)行后的結(jié)果就是一個迭代器呢?既然是迭代器,自然就可以被for of給遍歷。

for (const key of generation([1, 2, 3]) {    console.log(key) // 1, 2, 3}

果然可以。

經(jīng)典面試題: 自己實現(xiàn)一個next這樣的接口呢?

上面已經(jīng)有了實現(xiàn)的思路。通過一個標識符和一個判斷就能夠使用ES5來使用,如下代碼片段。

function generation(iterableObj) {    let nextIndex = 0    function next() {}    return {next: () => {    return nextIndex < iterableObj.length     ? { value: iterableObj[nextIndex++], done: false }     : { value: undefined, done: true } }    }}

當nextIndex下于數(shù)組長度的時候,沒有迭代完畢。

注意:nextIndex++是先跑nextIndex,再自增。

何為接口,后臺給你一個url地址,這個是網(wǎng)絡接口。next是設(shè)計師給你封裝的一個方法,你通過這個方法來達到上吧yield的兩個作用,所以next()也是一個接口,前端接口。簡單來說,一個封裝好的方法就是一個接口。

讓非迭代對象也可以使用for of 進行遍歷

正如第一節(jié)所說,Symbol.iterator的方法是迭代器的關(guān)鍵。那么我們也可以給Object掛載上該方法。既然該方法可以讓對象變成迭代器,就可以直接使用上面ES5實現(xiàn)next方法的代碼片段。

const obj = {  a: 1,  b: 2,  c: 3}Object.prototype[Symbol.iterator] = function value() {  const keys = Object.keys(Object(this))  let nextIndex = 0  function next() {    return nextIndex < keys.length? { value: [keys[nextIndex], obj[keys[nextIndex ++]]], done: false }: { value: undefined, done: true }  }  return {    next  }}for (const [key, value] in obj) {  console.log(key)}

for循環(huán)和for in的關(guān)系

for循環(huán)和for in 看著很像,其實只是共用了for這個關(guān)鍵字,它們都是JS引擎底層實現(xiàn)的東西。和forEach、map這些是基于for循環(huán)的API不同,它們是在實現(xiàn)在for循環(huán)之上的。

總結(jié)

  • 生成器generator執(zhí)行的結(jié)果就是一個迭代器
  • 生成器可以是也是由ES5實現(xiàn)的,不是基于底層API
  • 是否是迭代器的關(guān)鍵是Symbol.iterator方法

以上就是詳解JS前端使用迭代器和生成器原理及示例的詳細內(nèi)容,更多關(guān)于JS前端迭代器生成器的資料請關(guān)注其它相關(guān)文章!

標簽: JavaScript
主站蜘蛛池模板: 塑料薄膜_PP薄膜_聚乙烯薄膜-常州市鑫美新材料包装厂 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 四川实木门_成都实木门 - 蓬溪聚成门业有限公司 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 防渗土工膜|污水处理防渗膜|垃圾填埋场防渗膜-泰安佳路通工程材料有限公司 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 顶呱呱交易平台-行业领先的公司资产交易服务平台 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | ASA膜,ASA共挤料,篷布色母料-青岛未来化学有限公司 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 哈尔滨京科脑康神经内科医院-哈尔滨治疗头痛医院-哈尔滨治疗癫痫康复医院 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 球盟会·(中国)官方网站 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 阻垢剂,反渗透阻垢剂,缓蚀阻垢剂-山东普尼奥水处理科技有限公司 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 南京交通事故律师-专打交通事故的南京律师 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 北京开源多邦科技发展有限公司官网 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 硬齿面减速机_厂家-山东安吉富传动设备股份有限公司 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 刘秘书_你身边专业的工作范文写作小秘书| 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 橡胶电子拉力机-塑料-微电脑电子拉力试验机厂家-江苏天源 | 便携式高压氧舱-微压氧舱-核生化洗消系统-公众洗消站-洗消帐篷-北京利盟救援 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 |