老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

ES6中迭代器與生成器的示例分析

這篇文章將為大家詳細講解有關ES6中迭代器與生成器的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創新互聯建站-專業網站定制、快速模板網站建設、高性價比新華網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式新華網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋新華地區。費用合理售后完善,十年實體公司更值得信賴。

具體如下:

循環語句的問題

var colors = ["red", "green", "blue"];
for(var i=0; i

在ES6之前,這種標準的for循環,通過變量來跟蹤數組的索引。如果多個循環嵌套就需要追蹤多個變量,代碼復雜度會大大增加,也容易產生錯用循環變量的bug。

迭代器的出現旨在消除這種復雜性并減少循環中的錯誤。

什么是迭代器

我們先感受一下用ES5語法模擬創建一個迭代器:

function createIterator(items) {
  var i = 0;
  
  return { // 返回一個迭代器對象
    next: function() { // 迭代器對象一定有個next()方法
      var done = (i >= items.length);
      var value = !done ? items[i++] : undefined;
      
      return { // next()方法返回結果對象
        value: value,
        done: done
      };
    }
  };
}

var iterator = createIterator([1, 2, 3]);

console.log(iterator.next()); // "{ value: 1, done: false}"
console.log(iterator.next()); // "{ value: 2, done: false}"
console.log(iterator.next()); // "{ value: 3, done: false}"
console.log(iterator.next()); // "{ value: undefiend, done: true}"
// 之后所有的調用都會返回相同內容
console.log(iterator.next()); // "{ value: undefiend, done: true}"

以上,我們通過調用createIterator()函數,返回一個對象,這個對象存在一個next()方法,當next()方法被調用時,返回格式{ value: 1, done: false}的結果對象。

因此,我們可以這么定義:迭代器是一個擁有next()方法的特殊對象,每次調用next()都返回一個結果對象。

借助這個迭代器對象,我們來改造剛開始那個標準的for循環【暫時先忘記ES6的for-of循環新特性】:

var colors = ["red", "green", "blue"];
var iterator = createIterator(colors);
while(!iterator.next().done){
  console.log(iterator.next().value);
}

what?,消除循環變量而已,需要搞這么麻煩,代碼上不是得不償失了嗎?

并非如此,畢竟createIterator()只需寫一次,就可以一直復用。不過ES6引入了生成器對象,可以讓創建迭代器的過程變得更加簡單。

什么是生成器

生成器是一種返回迭代器的函數,通過function關鍵字后的星號(*)來表示,函數中會用到新的關鍵字yield。

function *createIterator(items) {
  for(let i=0; i

上面,我們用ES6的生成,大大簡化了迭代器的創建過程。我們給生成器函數createIterator()傳入一個items數組,函數內部,for循環不斷從數組中生成新的元素放入迭代器中,每遇到一個yield語句循環都會停止;每次調用迭代器的next()方法,循環便繼續運行并停止在下一條yield語句處。

生成器的創建方式

生成器是個函數:

function *createIterator(items) { ... }

可以用函數表達式方式書寫:

let createIterator = function *(item) { ... }

也可以添加到對象中,ES5風格對象字面量:

let o = {
  createIterator: function *(items) { ... }
};

let iterator = o.createIterator([1, 2, 3]);

ES6風格的對象方法簡寫方式:

let o = {
  *createIterator(items) { ... }
};

let iterator = o.createIterator([1, 2, 3]);

可迭代對象

在ES6中,所有的集合對象(數組、Set集合及Map集合)和字符串都是可迭代對象,可迭代對象都綁定了默認的迭代器。

來了來了,姍姍來遲的ES6循環新特性for-of:

var colors = ["red", "green", "blue"];
for(let color of colors){
  console.log(color);
}

for-of循環,可作用在可迭代對象上,正是利用了可迭代對象上的默認迭代器。大致過程是:for-of循環每執行一次都會調用可迭代對象的next()方法,并將迭代器返回的結果對象的value屬性存儲在變量中,循環將繼續執行這一過程直到返回對象的done屬性的值為true。

如果只需要迭代數組或集合中的值,用for-of循環代替for循環是個不錯的選擇。

訪問默認迭代器

可迭代對象,都有一個Symbol.iterator方法,for-of循環時,通過調用colors數組的Symbol.iterator方法來獲取默認迭代器的,這一過程是在JavaScript引擎背后完成的。

我們可以主動獲取一下這個默認迭代器來感受一下:

let values = [1, 2, 3];
let iterator = values[Symbol.iterator]();

console.log(iterator.next()); // "{ value: 1, done: false}"
console.log(iterator.next()); // "{ value: 2, done: false}"
console.log(iterator.next()); // "{ value: 3, done: false}"
console.log(iterator.next()); // "{ value: undefined, done: true}"

在這段代碼中,通過Symbol.iterator獲取了數組values的默認迭代器,并用它遍歷數組中的元素。在JavaScript引擎中執行for-of循環語句也是類似的處理過程。

用Symbol.iterator屬性來檢測對象是否為可迭代對象:

function isIterator(object) {
  return typeof object[Symbol.iterator] === "function";
}

console.log(isIterable([1, 2, 3])); // true
console.log(isIterable(new Set())); // true
console.log(isIterable(new Map())); // true
console.log(isIterable("Hello")); // true

創建可迭代對象

當我們在創建對象時,給Symbol.iterator屬性添加一個生成器,則可以將其變成可迭代對象:

let collection = {
  items: [],
  *[Symbol.iterator]() { // 將生成器賦值給對象的Symbol.iterator屬性來創建默認的迭代器
    for(let item of this.items) {
      yield item;
    }
  }
};

collection.items.push(1);
collection.items.push(2);
collection.items.push(3);

for(let x of collection) {
  console.log(x);
}

內建迭代器

ES6中的集合對象,數組、Set集合和Map集合,都內建了三種迭代器:

  • entries() 返回一個迭代器,其值為多個鍵值對。如果是數組,第一個元素是索引位置;如果是Set集合,第一個元素與第二個元素一樣,都是值。

  • values() 返回一個迭代器,其值為集合的值。

  • keys() 返回一個迭代器,其值為集合中的所有鍵名。如果是數組,返回的是索引;如果是Set集合,返回的是值(Set的值被同時用作鍵和值)。

不同集合的默認迭代器

每個集合類型都有一個默認的迭代器,在for-of循環中,如果沒有顯式指定則使用默認的迭代器。按常規使用習慣,我們很容易猜到,數組和Set集合的默認迭代器是values(),Map集合的默認迭代器是entries()。

請看以下示例:

let colors = [ "red", "green", "blue"];
let tracking = new Set([1234, 5678, 9012]);
let data = new Map();

data.set("title", "Understanding ECMAScript 6");
data.set("format", "print");

// 與調用colors.values()方法相同
for(let value of colors) {
  console.log(value);
}

// 與調用tracking.values()方法相同
for(let num of tracking) {
  console.log(num);
}

// 與調用data.entries()方法相同
for(let entry of data) {
  console.log(entry);
}

這段代碼會輸入以下內容:

"red"
"green"
"blue"
1234
5678
9012
["title", "Understanding ECMAScript 6"]
["format", "print"]

for-of循環配合解構特性,操縱數據會更方便:

for(let [key, value] of data) {
  console.log(key + "=" + value);
}

展開運算符操縱可迭代對象

let set = new Set([1, 2, 3, 4, 5]),
  array = [...set];
  
console.log(array); // [1,2,3,4,5]

展開運算符可以操作所有的可迭代對象,并根據默認迭代器來選取要引用的值,從迭代器讀取所有值。然后按返回順序將它們依次插入到數組中。因此如果想將可迭代對象轉換為數組,用展開運算符是最簡單的方法。

關于“ES6中迭代器與生成器的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。


分享名稱:ES6中迭代器與生成器的示例分析
轉載源于:http://www.xueling.net.cn/article/ghhpij.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 人妻人妻人人人 | a级片免费观看 | 亚洲美女又黄又爽在线观看 | 中文字幕久久精品一区二区 | 国产一区二区三级 | 亚洲无亚洲人成网站77777 | 久在线中文字幕乱码免费 | 国产字幕制服中文在线 | 在线观看国产91 | 精品一区二区精品 | 欧洲亚洲国产图片综合 | 午夜九九九 | 大地资源中文二页在线观看 | 亚洲第一成人av | brazzershd亚洲精品女 | 久久久久亚洲AV成人网址 | 我爱激情网 | 国产对白国语对白 | 日本网站免费在线观看 | av看片网站 | 九色porny自拍 | 国产女主播喷水视频在线观看 | 九一传媒在线观看 | 欧美精品在线播放 | 年轻的老师4 | 色一情一区二区三区四区 | 日本免费在线视频不卡一不卡二 | 久久久999国产视频 任你操精品视频 | 亚洲人网 | 成人春色在线观看免费网站 | 男女扒开双腿猛进入免费看污 | 亚洲日本乱码在线观看 | 国产亚洲一区二区三区 | 日韩少妇激情一区二区 | 久久久久久久99精品免费观看 | 班花在教室轮流澡到高潮视频 | 一本一道色欲综合网 | 人人妻人人澡AV天堂香蕉 | 在线中文字幕播放 | 视频在线观看入口黄最新永久免费国产 | h人成在线看免费视频 |