Contents
<p>jq each</p>
<p>jq each</p>
<p>jq each</p>
var arr = [1,2,3]
var nodeList = document.getElementsByTagName('p')
var $p = $('p')
arr.forEach(function (item) {
console.log(item);
})
var i , length = nodeList.length
for (i = 0;i<length;i++){
console.log(nodeList[i]);
}
$p.each(function (key,p) {
console.log(key,p)
})
arr
,a
标签需要三种方式。这里定义一个迭代器模式的方法统一这三个方法 //定义一个each 方法
function each(data) {
var $data = $(data) //生成迭代器
$data.each(function (key,val) {
console.log(key,val)
})
}
each(arr)
each(nodeList)
each($p)
class Container {
constructor(list) {
this.list = list
}
//生成遍历器
getInterator() {
return new Iterator(this.list)
}
}
class Iterator {
constructor(container) {
this.list = container.list
this.index = 0
}
next() {
if (this.hasNext()) {
return this.list[this.index++]
}
return null
}
hasNext() {
if (this.index >= this.list.length) {
return false
}
return true
}
}
//test
let arr = [1,2,3,4,5]
let container = new Container(arr)
let iterator = container.getInterator()
while (iterator.hasNext()) {
console.log(iterator.next())
}
next()
这个方法可顺序迭代子元素
//首先 返回[Symbol.Iterator]
function each(data) {
let iterator = data[Symbol.iterator]()
// console.log(iterator.next())
// console.log(iterator.next())
// console.log(iterator.next())
// console.log(iterator.next())
let item = {done:false}
while (!item.done){
item = iterator.next()
if(!item.done){
console.log(item.value)
}
}
}
let arr = [1,2,3,4]
// let nodeList = document.getElementsByTagName('a')
let m = new Map()
m.set('a',100)
m.set('b',100)
m.set('c',100)
each(arr)
// each(nodeList)
each(m)
//console
– 实际上ES6
已经实现了迭代器的方法for of
function each2 (data){
for (let item of data){
console.log(item)
}
}
each2(arr)
// each(nodeList)
each2(m)
Iterator
的价值不限于上述的数据遍历Generator
函数的使用Iterator
接口的要求Iterator
语法
[Symbol.iteartor]