JS生成器和迭代器
迭代器
为什么会说到这个呢?原因就是从扩展运算符和for…of的使用中发现这个问题的
let b = [1,2,3,4]
Math.max(...b)
=>4
let a ={
1:2,5:6,8:9}
Math.max(...a)
=>Uncaught TypeError: a is not iterable
嗯,我们从提示上知道a并不是可迭代的,那怎么做呢?看一下数组上的原型方法
MDN对于迭代器的描述:
在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值。 更具体地说,迭代器是通过使用
next()
方法实现 Iterator protocol 的任何一个对象,该方法返回具有两个属性的对象:value
,这是序列中的 next 值;和done
,如果已经迭代到序列中的最后一个值,则它为true
。如果value
和done
一起存在,则它是迭代器的返回值。
a[Symbol.iterator]=function(){
let keys = Object.keys(a);
let len = keys.length;
let values = Object.values(a);
let n = 0;
return {
next: function() {
if (n < len) {
return {
value: {
k: keys[n], v: values[n++]},
done: false
}
} else {
return {
done: true // 注意,一旦 done 为 true ,此时的 value 不返回
}
}
}
}
}
// 此时打印
console.log(...a)
=>Object {
k: "1", v: 2 }
Object {
k: "5", v: 6 }
Object {
k: "8", v: 9 }
String
、Array
、TypedArray
、Map
和Set
都是内置可迭代对象,因为它们的原型对象都拥有一个