<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Iterator
是 ES6 引入的一種新的遍歷機制。兩個核心
Symbol.iterator
的方法來實現。// 使用迭代 // 1.使用Symbol.iterator建立一個迭代器 const items = ['one','a','b']; const it = items[Symbol.iterator](); console.log(it);// Array Iterator{} // 2.呼叫next()方法向下迭代,next()返回當前的位置 const nx = it.next(); // 3.當done為true的時候遍歷結束。 console.log(nx); // {value: 'one', done: false}
可迭代的資料結構Array
,String
,Map
,Set
;
注意:物件不能使用迭代,跟迭代緊密相關的就是for..of
迴圈。
物件轉換為陣列使用相關的for..of
迴圈。
// 物件轉換為陣列 const arrlink = {"length":3,0:"zero","1":"one"};// 注意,第一項為宣告陣列的長度,如果沒有第一項,則為空陣列 console.log(Array.from(arrlink)); // (3) ['zero', 'one', undefined] 輸入引數的長度應為去除第一項後,超出將預設值位undefined for (let item of Array.from(arrlink)){ console.log(item);// 遍歷的結果為,物件的值 zero ,one ,undefined. }
ES6 新引入了Generator
函數,可以通過關鍵字yield
把函數流程掛起,(與 Python 中的生成器相似)。
為改變執行流程提供了可能,從而也為非同步程式設計提供瞭解決方案(類似於Python中使用該函數實現協程的相似)。
與普通函數的區分:
function
後面,函數名之前有個*
;yield
(產出)表示式。// 注意格式 函數關鍵字後面有 * function* func(a){ console.log("one"); yield a; console.log("two"); yield 2; console.log("three"); return 3; } // 每一次執行函數都會返回一個遍歷器物件 let fn = func(1); console.log(fn);// func{<suspended>} // 必須呼叫遍歷器的next()方法使指標下移到下一個狀態。 console.log(fn.next());// {value: 1, done: false} console.log(fn.next());// {value: 2, done: false} console.log(fn.next());// {value: 3, done: true} console.log(fn.next());// {value: undefined, done: true}
總結:Generator
函數是分段執行的,yield
語句是暫停執行,next
方法可以恢復執行。
function* add() { console.log('start'); let x = yield '2'; console.log('one:' + x);//20 let y = yield '3'; console.log('two:' + y);//30 console.log('total:' + (x + y));// 50 return x+y; } var a = add(); console.log(a.next(10)); console.log(a.next(20)); console.log(a.next(30)); // console.log(a.return(100));
return
方法返回給定值,並結束遍歷Generator
函數。提供返回的引數,返回指定的值,不提供,返回undefined
.
// 使用場景,為不具備Interator介面的物件提供了遍歷操作 function* objectEntries(obj) { // 獲取物件的所有key 儲存到陣列中 const propKeys = Object.keys(obj); // console.log(propKeys); for (const propKey of propKeys) { yield [propKey, obj[propKey]]; } } const obj = { name: 'Jane', age: 18 } obj[Symbol.iterator] = objectEntries; console.log(obj); for (const [key, value] of objectEntries(obj)) { console.log(`${key}: ${value}`); }
生成器的應用:
// ajax是典型的非同步操作.通過Generator函數部署Ajax操作,可以用同步的方式表達 function* main() { const res = yield request( 'https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976' ); console.log(res); console.log('1111'); } let it = main(); it.next() // https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976 function request(url) { // 假設 $.ajax({ url, method: 'get', success(res) { // it.next(res); it.next(res); } }) } // Generator 函數用來處理非同步操作 function* load() { loadUI(); yield showData(); hideUI(); } let itLoad = load(); // console.log(itLoad); // 第一次呼叫會顯示載入UI介面,並且非同步的載入資料 itLoad.next(); function loadUI() { console.log('載入loading介面.....'); } function showData(){ setTimeout(() => { console.log('資料載入完成.....'); // 第二呼叫,會呼叫hideUI(),隱藏Loading itLoad.next(); }, 1000); } function hideUI() { console.log('隱藏loading....'); } // 給任意物件部署Interator介面
到此這篇關於詳解ES6 中的迭代器和生成器的文章就介紹到這了,更多相關ES6 迭代器和生成器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45