1.迭代器定义
用于对于一个对象或内建对象里每个属性的迭代。简单说就是遍历 可迭代 对象用的。
可迭代 是指可在for … of … 这个语法结构中遍历
下面是迭代器在JS中实现的原理:
let range = {
from: 1,
to: 5
};
// 1. for..of 调用首先会调用这个:
range[Symbol.iterator] = function() {
// ……它返回迭代器对象(iterator object):
// 2. 接下来,for..of 仅与下面的迭代器对象一起工作,要求它提供下一个值
return {
current: this.from,
last: this.to,
// 3. next() 在 for..of 的每一轮循环迭代中被调用
next() {
// 4. 它将会返回 {done:.., value :...} 格式的对象
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
// 现在它可以运行了!
for (let num of range) {
alert(num); // 1, 然后是 2, 3, 4, 5
}
[Symbol.iterator] 这个方法被称为迭代器
在上面例子中它把 range 对象变成了一个可迭代对象(意思是说本来是不能用for…of…遍历这个对象,现在可以了)。
它让我们可以自定义每次遍历的返回值:value: this.current++
,在for … of … 遍历中用 num接收这个返回值,只要 num <= 5,就会一直遍历
而自定义迭代器的话可以让我们为遍历中的实体添加条件。例如,我们可以拆分迭代过程:迭代一部分,然后停止,做一些其他处理,然后再恢复迭代
内建的迭代器是只返回每个对象实体,比较难理解的话看下 面例子吧。
2.迭代器作用
因为很多JS 关于数据的定义中,比如Map ,Set,可迭代对象,数组,字符串等等都拥有可迭代特性。意味着我们可以用for…of …遍历它们。
字符串例子:
let str = '𝒳😂';
for (let char of str) {
alert( char ); // 𝒳,然后是 😂
}
对于字符串来说,一个 Char 就是它的一个实体。
数组:
let arrayLike = [
['cucumber', 500],
['tomatoes', 350],
['onion', 50]
]
// Error (no Symbol.iterator)
for (let item of arrayLike) {
console.log(item) //['cucumber', 500],then ['tomatoes', 350] ,then ['onion',50]
}
对于这个二维数组来说,每个数组就是一个实体
Set:
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
set.add(john);
set.add(pete);
for (let user of set) {
alert(user.name); // John(然后 Pete)
}
等等。。。。不再举例了,自己试试其他的吧