成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

ES6Iterator遍歷器原理,應用場景及相關常用知識拓展詳解

本文實例講述了ES6 Iterator遍歷器原理,應用場景及相關常用知識拓展。分享給大家供大家參考,具體如下:

成都創(chuàng)新互聯(lián)公司專注于平鄉(xiāng)網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供平鄉(xiāng)營銷型網(wǎng)站建設,平鄉(xiāng)網(wǎng)站制作、平鄉(xiāng)網(wǎng)頁設計、平鄉(xiāng)網(wǎng)站官網(wǎng)定制、成都微信小程序服務,打造平鄉(xiāng)網(wǎng)絡公司原創(chuàng)品牌,更為您提供平鄉(xiāng)網(wǎng)站排名全網(wǎng)營銷落地服務。

介紹Iterator之前先列舉下js的表示數(shù)據(jù)集合結構的幾種方式:

在es6之前有 Array , Object, es6新增了 map, set,當然用戶也可以組合使用這幾種數(shù)據(jù)結構,靈活存儲數(shù)據(jù)。

但是當數(shù)據(jù)結構變得復雜后,怎樣取到里面的數(shù)據(jù)就也相對復雜,這就需要有一種讀取數(shù)據(jù)的統(tǒng)一的接口機制,來處理不同的數(shù)據(jù)結構。

遍歷器就是這樣一種接口機制,Iterator是一種接口,為不同數(shù)據(jù)結構提供統(tǒng)一的接口機制。

相應的任何數(shù)據(jù)結構只要部署Iterator接口,就可以完成遍歷操作。

Iterator的作用:

1,為各種數(shù)據(jù)結構提供一種統(tǒng)一的,簡單的訪問接口;

2,使得數(shù)據(jù)結構的成員能夠按照某種次序排列;

3,ES6提供了一種新的遍歷循環(huán)(for......of.....),Iterator被for......of.....循環(huán)調(diào)用;

Iterator本質(zhì):

遍歷器本質(zhì)上是一種指針對象,指針對象上有next()方法,第幾次調(diào)用就指向第幾個成員

Iterator上next()方法調(diào)用返回:

1,返回當前成員的信息

2,返回遍歷是否結束

模擬實現(xiàn)Iterator

var it = makeIterator(['a', 'b']);
 
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
 
function makeIterator(array) {
 var nextIndex = 0;
 return {
  next: function() {
   return nextIndex < array.length ?
    {value: array[nextIndex++], done: false} :
    {value: undefined, done: true};
  }
 };
}

使用Typescript

interface Iterable {
 [Symbol.iterator]() : Iterator,
}
 
interface Iterator {
 next(value?: any) : IterationResult,
}
 
interface IterationResult {
 value: any,
 done: boolean,
}

關于默認的Iterator接口:

ES6 規(guī)定,默認的 Iterator 接口部署在數(shù)據(jù)結構的Symbol.iterator屬性,或者說,一個數(shù)據(jù)結構只要具有Symbol.iterator屬性,就可以認為是“可遍歷的”(iterable)。

Symbol.iterator的本質(zhì):

1,Symbol.iterator本身是一個函數(shù),對應當前數(shù)據(jù)結構默認的遍歷器生成函數(shù);

2,執(zhí)行Symbol.iterator這個函數(shù)會返回一個遍歷器。

實例:

const obj = {
 [Symbol.iterator] : function () {
  return {
   next: function () {
    return {
     value: 1,
     done: true
    };
   }
  };
 }
};
//這樣定義后對象就有了Iterator接口
//執(zhí)行對象obj的symbol.iterator后,返回一個遍歷器

具有原生iterator的數(shù)據(jù)結構:

Array , Map, Set, String, TypedArray, 函數(shù)的argulements對象,NodeList對象(節(jié)點對象);

數(shù)組iterator實例

let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
 
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }

對象iterator接口實現(xiàn)

class RangeIterator {
 constructor(start, stop) {
  this.value = start;
  this.stop = stop;
 }
 
 [Symbol.iterator]() { return this; }
 
 next() {
  var value = this.value;
  if (value < this.stop) {
   this.value++;
   return {done: false, value: value};
  }
  return {done: true, value: undefined};
 }
}
 
function range(start, stop) {
 return new RangeIterator(start, stop);
}
 
for (var value of range(0, 3)) {
 console.log(value); // 0, 1, 2
}

注意:如果一個對象沒有iterator接口,而其原型鏈上有Iterator接口,也可以通過繼承而擁有該接口;

使用while循環(huán)遍歷

var $iterator = ITERABLE[Symbol.iterator]();
var $result = $iterator.next();
while (!$result.done) {
 var x = $result.value;
 // ...
 $result = $iterator.next();
}

基本概念基本就是這些,接下來看下使用場景

Iterator的使用場景:

默認調(diào)用場景:

for....of...循環(huán), 解構賦值, 擴展運算符, yield*關鍵字

ES6 借鑒 C++、Java、C# 和 Python 語言,引入了for...of循環(huán),作為遍歷所有數(shù)據(jù)結構的統(tǒng)一的方法

這里主要介紹下yield*,其余幾個都比較好理解

yield*后面跟的是一個可遍歷的結構,它會調(diào)用該結構的遍歷器接口

let generator = function* () {
 yield 1;
 yield* [2,3,4];//執(zhí)行時默認遍歷數(shù)組
 yield 5;
};
 
var iterator = generator();
 
iterator.next() // { value: 1, done: false }
iterator.next() // { value: 2, done: false }
iterator.next() // { value: 3, done: false }
iterator.next() // { value: 4, done: false }
iterator.next() // { value: 5, done: false }
iterator.next() // { value: undefined, done: true }

其他場景:

由于數(shù)組的遍歷會調(diào)用遍歷器接口,所以任何接受數(shù)組作為參數(shù)的場合,其實都調(diào)用了遍歷器接口

  • for...of
  • Array.from()
  • Map(), Set(), WeakMap(), WeakSet()(比如new Map([['a',1],['b',2]])
  • Promise.all()
  • Promise.race()

知識拓展

遍歷器對象的 return(),throw()

return方法在循環(huán)退出或者報錯時調(diào)用

throw方法主要是配合 Generator 函數(shù)使用(詳見generator)

計算生成的數(shù)據(jù)結構

在原有數(shù)據(jù)結構基礎上計算生成的數(shù)據(jù)結構,例如Object,Map,Set,Array的entries(),keys(), value()方法生成的數(shù)據(jù)結構,默認具有iterator接口

類似數(shù)組對象

常見:字符串,NodeList節(jié)點對象,參數(shù)arguments

1,并不是所有類似數(shù)組的對象都具有 Iterator 接口

2,對于類數(shù)組對象可以通過Array.From()將類數(shù)組對象轉(zhuǎn)化為數(shù)組對象

3,for-of可以識別32 位 UTF-16 字符

for (let x of 'a\uD83D\uDC0A') {
 console.log(x);
}

for-of和其他遍歷方法對比:

for循環(huán),forEach循環(huán),for...in...循環(huán)

forEach循環(huán)無法中途跳出

for...in循環(huán)有幾個缺點(for...in循環(huán)主要是為遍歷對象而設計的,不適用于遍歷數(shù)組),

  • 數(shù)組的鍵名是數(shù)字,但是for...in循環(huán)是以字符串作為鍵名“0”、“1”、“2”等等。
  • for...in循環(huán)不僅遍歷數(shù)字鍵名,還會遍歷手動添加的其他鍵,甚至包括原型鏈上的鍵。
  • 某些情況下,for...in循環(huán)會以任意順序遍歷鍵名。

對于for...of...

  • 有著同for...in一樣的簡潔語法,但是沒有for...in那些缺點。
  • 不同于forEach方法,它可以與breakcontinuereturn配合使用。
  • 提供了遍歷所有數(shù)據(jù)結構的統(tǒng)一操作接口。

參考:http://es6.ruanyifeng.com/

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

文章標題:ES6Iterator遍歷器原理,應用場景及相關常用知識拓展詳解
網(wǎng)址分享:http://jinyejixie.com/article26/poecjg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站網(wǎng)頁設計公司全網(wǎng)營銷推廣、企業(yè)建站、云服務器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
巧家县| 明水县| 麟游县| 古丈县| 萝北县| 竹溪县| 韶山市| 安宁市| 合江县| 黄梅县| 沅陵县| 澄迈县| 思茅市| 竹溪县| 南投市| 临沂市| 吴桥县| 福贡县| 安陆市| 东丰县| 澄江县| 华安县| 奇台县| 涡阳县| 江达县| 安图县| 屏南县| 鹿泉市| 拜泉县| 九江县| 崇州市| 庄浪县| 错那县| 丁青县| 余庆县| 通渭县| 深泽县| 托克逊县| 金坛市| 长泰县| 通河县|