ES6入門教程之Iterator與for...of迴圈詳解,es6for...of

來源:互聯網
上載者:User

ES6入門教程之Iterator與for...of迴圈詳解,es6for...of

本文主要介紹了關於ES6中Iterator與for...of迴圈的相關內容,分享出來供大家參考學習,需要的朋友們下面來一起看看詳細的介紹:

一、Iterator(遍曆器)

遍曆器(Iterator)是一種協議,任何對象只要部署了這個協議,就可以完成遍曆操作。在ES6中遍曆操作特質for….of迴圈。

它的作用主要有兩個:

  • 為遍曆對象的屬性提供統一的介面。
  • 使對象的屬效能夠按次序排列。

ES6的遍曆器協議規定,部署了next方法的對象,就具備了遍曆器功能。next方法必須返回一個包含value和done兩個屬性的對象。value屬性是當前遍曆的位置的值,而done屬性是一個布爾值,用來表示遍曆是否結束。

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

在上面程式碼片段中,定義了一個makeIterator函數,它的作用是返回一個遍曆器對象,用來遍曆參數數組。特別需要注意的是next傳回值的構造。

下面,再看看一個遍曆器的範例程式碼片段:

 function idMaker() {  var index = 0;   return {   next: function() {    return {value: index++, done: false};   }   } } var it = idMaker(); it.next().value; //'0' it.next().value; //'1' it.next().value; //'2'

二、for…of 迴圈

在ES6中,一個對象只要部署了next方法,就被視為是具有了iterator介面,就可以用for…of迴圈遍曆它的值。

 function idMaker() {  var index = 0;  return {   next: function() {    return {value: index++, done: false};   }  } } for (var n of it) {  if (n > 5) {   break;   console.log( n );  } } //0 //1 //2 //3 //4 //5

上面的代碼說明,for….of預設從0開始迴圈。

數組原生具備iterator介面

 const arr = [1, 5, 3, 9]; for (let v of arr) {  console.log( v ); } //1 //5 //3 //9

相比較,Js原有的for…in迴圈,只能獲得對象的鍵名,不能直接擷取索引值。ES6提供了for…of迴圈,允許遍曆擷取索引值。

 var arr = ['a', 'b', 'c', 'd']; for (a in arr) {  console.log( a ); } //0 //1 //2 //3 for (a of arr) {  console.log( a ); } //0 //1 //2 //3

上面的程式碼片段表明,for…in迴圈讀取鍵名,而for…of迴圈讀取索引值。

對於Set和Map結構的資料,可以直接使用for…of迴圈。

 var name = ['S', 'D', 'J', 'Z', 'G', 'G', 'G']; for ( var e of name) {  console.log( e ); } //S //D //J //Z //G var es6 = new Map(); es6.set('edition', 6); es6.set('committee', 'TC39'); es6.set('standard', 'ECMA-262'); for(var [name, value] of es6) {   console.log(name + ": " + value); } // edition: 6 // commttee: TC39 // standard: ECMA-262

在上面的程式碼片段中,示範了如何遍曆Set結構和Map結構,後者是同是遍曆鍵名和索引值。

對於普通的對象,for...of結構不能直接使用,否則則會報錯。必須項部署iterator介面才能使用。但是,在這種情況下,for...in迴圈依然可以遍曆鍵名。

 var es6 = {  name: "G.Dragon",  year: 22,  love: "coding" }; for (e in es6) {  console.log( e ); } //name //year //love for( e of es6) {  console.log( e ); } // TypeError: es6 is not iterable

最後,總結一下。for...of迴圈可以使用的範圍包括數組、類似數組的而對象(比如argument對象、DOM NodeList對象)、Set和Map結構、後文的Generator對象,以及字串。下面是使用for...of迴圈遍曆字串和DOM NodeList對象的例子。

 // 字串例子 let str = "hello"; for (let s of str) {  console.log( s ); } //h //e //l //l //o // DOM NodeList對象的例子 let paras = document.getSelectorAll("p"); for (let p of paras) {  p.classList.add("test"); }

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流,謝謝大家對幫客之家的支援。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.