js迭代器iterator

iterator(迭代)一般很少直接使用, 但是卻是很常用很重要的功能.
例如 :
對象的擴展運算符(...)內(nèi)部其實是調(diào)用了 Iterator 接口。
在es6 中統(tǒng)一了遍歷的接口 Iterator,Iterator 接口的目的,就是為所有數(shù)據(jù)結(jié)構(gòu),提供了一種統(tǒng)一的訪問機制,即for...of循環(huán)。
字符串也可以使用擴展運算符

var arr = [..."hello"];
console.log(arr)
// ["h", "e", "l", "l", "o"]

rest運算符, 與擴展運算符是逆運算

擴展運算符:數(shù)組=>分割序列

// arguments變量的寫法
function sortNumbers() {
  return Array.prototype.slice.call(arguments).sort();
}
?
// rest參數(shù)的寫法
const sortNumbers = (...numbers) => numbers.sort();

rest運算符:分割序列=>數(shù)組
rest可以代替arguments變量

回到主題, 迭代
Symbol.iterator 為每一個對象定義了默認的迭代器。

描述

當需要對一個對象進行迭代時(比如開始用于一個for..of循環(huán)中),它的@@iterator方法都會在不傳參情況下被調(diào)用,返回的迭代器用于獲取要迭代的值。

一些內(nèi)置類型擁有默認的迭代器行為,其他類型(如 Object)則沒有。下表中的內(nèi)置類型擁有默認的@@iterator方法:

更多信息請參見迭代協(xié)議

js中對象分為可迭代和不可迭代 如果是可迭代哪它就會有一個[Symbol.iterator] 函數(shù)

這個函數(shù)就是對象的迭代器函數(shù),如用for of 如果遍歷的對象沒有這個迭代方法那么就會報錯.

for of 傳入的是可迭代對象,但是如何吧一個不可迭代的對象變?yōu)榭傻膶ο竽?!很簡單就是自己寫一個[Symbol.iterator]函數(shù)。

let obj = {
   a: 1,
   b: 2
}
obj[Symbol.iterator] = function(){
   let  keys = Object.keys(obj) 
   let len = keys.length;
   let n = 0;
   // 返回對象 每次迭代會自動調(diào)用對象里面的next方法
   return {
       next() {
          //  返回值有value和done
          return n < len ? {
               value: { k: keys[n], v: obj[keys[n++]] },
               done: false 
          }: { done: true }
       }
   }
}

你以為迭代就這么簡單的結(jié)束了嗎?現(xiàn)在再講一個新東西 yield

. yield是ES6的新關(guān)鍵字,使生成器函數(shù)執(zhí)行暫停,yield關(guān)鍵字后面的表達式的值返回給生成器的調(diào)用者。它可以被認為是一個基于生成器的版本的return關(guān)鍵字。

. yield關(guān)鍵字實際返回一個IteratorResult(迭代器)對象,它有兩個屬性,value和done,分別代表返回值和是否完成。

. yield無法單獨工作,需要配合generator(生成器)的其他函數(shù),如next,懶漢式操作,展現(xiàn)強大的主動控制特性。

yield自定義一個迭代器

var myIterable = {}
myIterable[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
};
[...myIterable] // [1, 2, 3]


// 為不可迭代的對象添加迭代器
let obj = {
    a: 1,
    b: 2
}
obj[Symbol.iterator] = function* () {
    let keys = Object.keys(obj);
    //取到key值的長度
    let len = keys.length;
    //定義循環(huán)變量
    let n = 0;
    //條件判斷
    while (n < len) {
        yield { k: keys[n], v: obj[keys[n++]] };
    }
}
//返回的是個對象的key和value
for (let { k, v } of obj) {
    console.log(k, v);
}

function* () {} 這種函數(shù)名字叫 generator函數(shù), 生成器函數(shù), 下一篇再重點講這個哈.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容