一、迭代器
-
在JavaScript中,迭代器也是一个具体的对象,这个对象需要符合迭代器协议(iterator protocol)
-
迭代器协议定义了产生一系列值(无论是有限还是无限个)的标准方式;
-
在JavaScript中这个标准就是一个特定的next方法;
next方法要求:next方法是一个无参数或者有一个参数的函数,返回结果应当拥有以下两个属性的对象:
1、done(boolean) : done返回一个布尔值: 可能是false, 可能是true如果迭代器可以产生序列中的下一个值,则为 false。(这等价于没有指定 done 这个属性)
如果迭代器已将序列迭代完毕,则为 true。这种情况下,value 是可选的,如果它依然存在,即这个值为迭代结束之后默认返回值。2、 value:value的返回值: 可能是一个具体的值, 可能是undefined.
例如:
// 例如有两个数组
const nums = [10, 20, 30, 40]
const names = ["aaa", "bbb", "ccc", "ddd"]
// 封装一个用于创建迭代器的函数
function createArrayIterator(arr) {
let index = 0
return {
next: function() {
if (index < arr.length) {
return {
done: false, value: arr[index++] }
} else {
// value不写, 默认就是undefined
return {
done: true }
}
}
}
}
// 调用函数创建nums构造器
const numsIterator = createArrayIterator(nums)
console.log(numsIterator.next()) // {done: false, value: 10}
console.log(numsIterator.next()) // {done: false, value: 20}
console.log(numsIterator.next()) // {done: false, value: 30}
console.log(numsIterator.next()) // {done: false, value: 40}
console.log(numsIterator.next()) // {done: true}
// 调用函数创建names构造器
const namesIterator = createArrayIterator(names)
console.log(namesIterator.next()) // {done: false, value: 'aaa'}
console.log(namesIterator.next()) // {done: false, value: 'bbb'}
console.log(namesIterator.next()) // {done: false, value: 'ccc'}
console.log(namesIterator.next()) // {done: false, value: 'ddd'}
console.log(namesIterator.next()) // {done: true}
二、什么是可迭代对象:
1.有[Symbol.iterator] 这个属性;
2.调用这个[Symbol.iterator] 属性(方法)需要返回一个迭代器。
三、原生迭代器对象
事实上我们平时创建的很多原生对象已经实现了可迭代协议,会生成一个迭代器对象的:
比如 : String、Array、Map、Set、arguments对象、NodeList集合;
我们可以看一下:
定义一个数组:
let arr =[1,2,3]
其中调用arr[Symbol.iterator]()会返回数组的迭代器
调用迭代器的next()方法会返回应当拥有以下两个属性的对象: