順序訪問乙個集合,基本上是陣列形式的,物件不是有序的列表無法順序訪問。使用者無需知道集合的內部結構。
舉例:
>
jqueryp
>
>
jqueryp
>
>
jqueryp
>
let arr =[1
,2,3
];let nodelist = document.
getelementsbytagname
('p');
//是乙個類陣列,但不是陣列
let $p =$(
'p')
;//要遍歷這三個不同資料型別的變數,需要三中遍歷方式
//第一
arr.
foreach
(function
(item)
)//第二
for(
let i =
0; i < nodelist.length; i++
)//第三
$p.each
(function
(key, p)
)
現在寫乙個方法能同時遍歷以上三種資料。
class
iterator
next()
return
null
}hasnext()
return
true;}
}class
container
//生成遍歷器
getiterator()
}let container =
newcontainer([
1,2,
3,4,
5,6]
);let iterator = container.
getiterator()
;while
(iterator.
hasnext()
)// 1
// 2
// 3
// 4
// 5
// 6
以上是自己手寫的乙個迭代器,es6中已經有封裝好的迭代器。
es6中的iterator語法:
es6語法中,有序集合的資料型別(array map set string typedarray argument nodelist
)有很多種(注意:object不是有序集合,可以用map代替),這時需要乙個統一的遍歷介面訪問這些有序集合中的資料,es6中的iterator可以做到。
有序集合的資料型別需要有[symbol.iterator]
屬性,這個屬性的值是函式,執行這個函式會返回乙個迭代器,這個迭代器有next方法可順序迭代子元素,這是es6中幫我們封裝好的,上面例子中的的next是我們自己寫的。
可執行array.prototype[symbol.iterator]
測試。
function
each
(data)
;while
(!item.done)}}
each
(arr)
;each
(nodelist)
;each
($p)
;
但是!!!
symbol.iterator並不是人人都知道的,也不是每個人都需要封裝乙個 each 方法,因此,es6提供了乙個新的方法for...of
來遍歷:
function
each
(data)
}each
(arr)
;each
(nodelist)
;each
($p)
;
for...in
是用來遍歷物件的,for...of
是遍歷迭代器的。
iterator 的價值不限於上述幾個型別的遍歷,還有generator函式的使用。generator返回的資料符合iterator介面遍歷的要求,所以generator函式也可以使用iterator語法。
當然也可以用for…of。
function
*foo()
//當然也可以用for...of
for(
const v of
foo())
// 1
// 2
// 3
// 4
// 5
// 6
迭代器模式
迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而不是暴露該物件的內部表示。乙個聚集物件,而且不管這些物件是什麼都需要遍歷的時候,你就應該考慮用迭代器模式。你需要對聚集有多種方式遍歷時,可以考慮用迭代器模式。為遍歷不同的聚集結構提供如開始,下乙個,是否結束,當前哪一項等統一...
迭代器模式
我最早接觸的設計模式就是迭代器模式了哈 為什麼要有迭代器模式呢?看下下面的 就知道了哈 對於乙個陣列物件sz 我們要怎麼遍歷呢?public void bianlisz class geweishu public myiterator getiterator private class geweis...
迭代器模式
迭代器模式 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件多的內部表示。1 iterator抽象類 public abstract class iterator 2 aggregate聚集抽象類 public abstract class aggregate 3 concreteite...