迭代器
# 迭代器
# 什么是迭代
从一个数据集合中按照一定的顺序,不断取出数据的过程。
# 迭代和遍历的区别
迭代强调的是依次取数据,并不保证取多少,也不保证把所有的数据取完。 遍历强调的是把整个数据依次全部取出。
比如有一个数组 arr=[1,2,3,4,5,6]
遍历就是将数组arr的数据按照顺序从头到尾依次取一遍
迭代是从数组arr里面先取一个出来,然后我不知道要不要继续取下一个,也不知道这个数组到底有多大,针对的只是当前这一项,并不知道后面的情况。
# 迭代器
对迭代过程的封装,再不同的语言中有不通的表现形式。通常为对象。
就是帮我们取数的工具。
# 迭代模式
一种设计模式,用来统一迭代过程,并规范了迭代器的规格:
- 迭代器应该具有得到下一个数据的能力。
- 迭代器应该具有判断是否还有后续数据的能力。
# JS中的迭代器
如果一个对象具有next
方法,并且该方法返回一个对象,对象的格式如下
{value:"any-值",done:"Boolean-是否迭代完成"}
则认为该对象是一个迭代器。
含义:
- next方法:用于得到下一个数据
- 返回的对象:
- value:Any 下一个数据的值
- done:Boolean 是否完成迭代
# 使用迭代器获取数组中的值
var arr = [1, 2, 3, 4, 5, 6]
const Iterator = {
index: 0,
next() {
const obj = {
value: arr[this.index],
done: this.index >= arr.length
}
this.index++;
return obj
}
}
console.log(Iterator.next());
console.log(Iterator.next());
console.log(Iterator.next());
console.log(Iterator.next());
console.log(Iterator.next());
console.log(Iterator.next());
console.log(Iterator.next());
# 迭代器生成
function createIterator(arr) {
return {
index: 0,
next() {
const obj = {
value: arr[this.index],
done: this.index >= arr.length
}
this.index++;
return obj
}
}
}
# 可迭代协议
ES6规定,如果一个对象具有知名符号属性Symbol.iterator
,并且属性值是一个迭代器创建函数,则该对象是可迭代的(iterable)
也就是说官方替我们实现了一个迭代器接口,我们可以通过这个接口拿到默认跌倒器,也能实现一个我们自己的迭代器
var arr = [1, 2, 3, 4, 5, 6]
const it = arr[Symbol.iterator]();
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
arr[Symbol.iterator] = function () {
let index = this.length - 1;
let _this = this;
return {
next() {
const obj = {
value: _this[index],
done: index < 0
}
index--;
return obj
}
}
};
const it = arr[Symbol.iterator]();
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())
console.log(it.next())