iterator作用 為所有的數據結構提供統一的訪問方式。 介面對象 介面對象一共有3個方法,next()方法、return()方法、throw()方法。 next() 必填 用於for..of迭代。 該方法返回一個對象{value,done}。 value:元素值,done:狀態位,用於指定迴圈是 ...
iterator作用
為所有的數據結構提供統一的訪問方式。
介面對象
介面對象一共有3個方法,next()方法、return()方法、throw()方法。
next() 必填
用於for..of迭代。
該方法返回一個對象{value,done}。 value:元素值,done:狀態位,用於指定迴圈是否結束。
return() 可選
用於break語句,或出錯結束迴圈。
throw() 可選
throw方法主要是配合 Generator 函數使用
介面實現
通過內置Symbol.iterator屬性來實現介面,該介面主要是返回一個對象指針,然後通過調用介面對象的next方法來實現訪問下一個元素值。
具備iterator介面的對象
1:數組
2:字元串
3:函數的 arguments 對象
4: Set/Map 數據結構
5:TypedArray
6:NodeList 對象
介面調用
1:手動調用。
2:for..of語句
3:... (擴展運算符)
特點
for...of迴圈還有一個特點,就是會正確識別 32 位 UTF-16 字元
實例代碼
class Node { constructor(value) { this.value = value; this.next = null; } } class Link { /** * 構造函數 */ constructor(value) { this.head = new Node(value); } /** * 插入 * @param {any} value * @param {any} item */ insert(value, item) { let node = new Node(value); let current = this.find(item); node.next = current.next; current.next = node; } /** * 查詢節點 * @param {any} item * @returns {Node} */ find(item) { let current = this.head; while (current && current.value != item) { current = current.next; } return current; } /** * iterator介面實現 */ [Symbol.iterator]() { let current = null, target = this; return { next() { current = current != null ? current.next : target.head; if (current != null) { return { value: current.value, done: false }; } return { value: undefined, done: true }; }, return() { return { done: true } } } } }
let l = new Link(0); l.insert(2, 0); l.insert(5, 2); l.insert(3, 2); // 到2的後面插入一個3 // for..of 方式調用介面 for (let o of l) { console.log(o); } // 擴展運算符調用介面 console.log(...l); // 手動調用。 // 獲取介面對象 let iter = l[Symbol.iterator](); // 調用next 方法 console.log(iter.next()); console.log(iter.next()); console.log(iter.next());
源碼下載:https://pan.baidu.com/s/1sASqhXzIC94ae-SYYv0CAg
我的百度經驗:https://jingyan.baidu.com/article/b7001fe1c5a1240e7282dd8b.html