每天學點ES6 —— 打通任督二脈的 Iterator 接口

相關 es6 文章:

概念

Iterator -遍歷器。

javascript 中表示‘集合’的數據結構有 數組 對象 Set Map, Iterator 為它們提供了統一訪問接口,即遍歷器(對象),方便遍歷。

部署

ES6 中 Iterator 部署在 Symbol.iterator 屬性中,它返回一個方法,執行該方法就會得到遍歷器對象。

數組(類數組) Set Map 這三種結構都默認部署了 Symbol.iterator 。

遍歷器的使用 (next)

遍歷器對象可以使用 .next() 方法獲取值,返回一個對象:值和done(是否完成)。

// 讓我們使用遍歷器完成數組的遍歷

var arr=[1,2,3];

var iter=arr[Symbol.iterator]();

iter.next(); //{value: 1, done: false}

iter.next(); //{value: 2, done: false}

iter.next(); //{value: 3, done: false}

iter.next(); //{value: undefined, done: true}

注:遍歷器對象還有 return() 和 throw() 方法,一般用不到,不再詳述。

。。等等,什麼鬼?遍歷個數組這麼麻煩!?當然有簡單的

使用 for of 遍歷

以下數據結構都默認部署了 Symbol.iterator:

1. Map Set

2. Array

3. ArrayLike (String arguments NodeList)

使用 for..of... 循環遍歷部署了 Interator 接口的數據結構

//舉幾個常見的栗子

//set

var s=new Set(['a','b','c']);

for(var i of s){

 console.log(i);//a b c

}

//map

var m=new Map([['a',1],['b',2]]);

for(var [k,v] of m){

 console.log(k);//a b

 console.log(v);//1 2

}

//數組

var arr=[1,2,3];

for(var i of arr){

 console.log(i);//1 2 3

}

//類數組的遍歷(自己轉的類數組不含遍歷器的不行)

var p=document.getElementsByTagName('p');

for(var i in p){

 ...

}

注:字符串是一個類數組對象,也有 Iterator 接口;

。。橋豆麻袋,栗子中沒有對象啊,沒錯,默認不能使用 for of !

那麼問題來了,說好的大統一呢?

實際上一來對象的遍歷使用 for in即可,並不需要for of,其次只要給對象加上遍歷器對象就使用 for of 了(不詳述)

Iterator 接口調用的默認調用

1. 解構賦值

解構賦值實際上調用了 Iterator 接口

let s=new Set(['a','b','c']);

let [x,y]=s;

x; //"a"

y; //"b"

2. 擴展運算符

實際上,只要是有 Iterator 接口就可以使用擴展運算符

let str='abc';

[...str] //["a", "b", "c"]

心塞,默默的曬圖

每天學點ES6 —— 打通任督二脈的 Iterator 接口

文章到這裡結束,下篇 ☞ Generator

【關注一下不迷路~】

每天學點ES6 —— 打通任督二脈的 Iterator 接口

【html】【css】【html】【css】【javascript】【html】【javascript】【css】【javascript】【css】


分享到:


相關文章: