一、作用
(1)為各種“集合”的數據結構,提供一個統一的、簡便的訪問接口
Object 正是因為無法確認屬性的遍歷的順序,所以沒有部署Iterator接口)
(3)使得“集合”數據結構能運用for....of循環遍歷,Iterator 接口主要供for...of消費。
二、原理
本質是一個指針對象),不斷調用next方法,返回一個包含value和done的對象
var it = makeIterator(['a','b']);
console.dir(it.next());
console.dir(it.next());
console.dir(it.next());
function makeIterator(arr){
let index = 0;
return {
next: function(){
return index < arr.length ?
{value:arr[index++],done:false} : {value:undefined,done:true};
}
};
}
三、具備Iterator接口的數據結構
並不是所有都可以,不行的對象,可以通過Array.from() 轉化為數組)
let arrayLike = { length: 2, 0: 'a', 1: 'b' };
// 報錯
for (let x of arrayLike) {
console.log(x);
}
// 正確
//Array.from():從一個類似數組或可迭代對象創建一個新的,淺拷貝的數組實例
for (let x of Array.from(arrayLike)) {
console.log(x);
}
(2)特徵:具有 Symbol.iterator 屬性(本身是一個遍歷器生成函數,一執行,返回一個遍歷器)
const set = new Set("efe");
const it = set[Symbol.iterator]();
console.dir(it.next());
console.dir(it.next());
console.dir(it.next());
四、調用場合
(1)解構賦值
const arr = ['a','b'];
[x,y] = arr;
console.log(x); //a
console.log(y); //b
注:任何部署了interator的數據結構,都可以通過擴展運算符轉化為數組)
const set = new Set("efe");
console.dir([...set]);
(3)yield *
(4)for....of.....
五、還有方法return() 和 throw(),可選,不一定要部署
(1)return() : 遇到break或報錯會調用,返回一個對象
六、與其他遍歷語法的比較
(1)例子:數組
常用的遍歷方法: for forEach for....in..... for....of.....
其中,forEach 缺點是:
即使使用break或return命令,還是不能跳出循環 (沒有剎車系統~~)。
for.....in...... 缺點是:
1、鍵名的類型是字符串;
2、即使不是數字鍵名,同樣進行遍歷(所以for....in.....更適合在對象中使用,數組還是算了吧~~)
3、亂序遍歷(先遍歷數字鍵名,其他按加入順序。到底還是因為所有鍵名都遍歷造成的問題,也難怪Object部署不了遍歷器~~)。
for....of....... 的優點是:
剛好彌補了上面兩個的不足,既能隨意暫停遍歷,又能按順序進行遍歷
const arr = ['a','b'];
arr.name = "zhengxiaona";
arr.push('c');
arr.age = "zhengxiaona";
for(let i in arr){
console.log(i);
}
console.log("..............");
arr.forEach((item,index) => {
console.log(`${item}......${index}`);
return;
});
console.log("..............");
for(let value of arr){
console.log(value);
break;
}