生成器
·
Yin灏
迭代器协议与生成器(ES6)
let iterator01 = {
*[Symbol.iterator]() {
for (let i = 0; i < 10; i++) {
yield parseInt(10 * (i + Math.random())); // 用过 yield 产生的值,最终会被放在数组实例中
}
}
}
for (let n of iterator01) {
console.log(n) // 0 15 25 35 45 55 65 75 85 95
}
通过关键字 yield
,此 for
循环语句在每次迭代的时候,均会将表达式 (parseInt(10 * (i + Math.random()))
)的结果值,产生(yield
)至(这个生成器最终返回)的数组实例中。
上述语法依据迭代器协议的规范,定义了作为生成器的变量 iterator01
。其中,Symbol.iterator
可被视为(在特定对象实例(object instance
)中,作为内置的迭代器(iterator
)的索引数据(index data
),进而是的 (*[Symbol.iterator](){ ... }
)定义了新的迭代器函数。)
生成器函数的定义和用法(ES6)
function* iterator02(end) {
for (let i = 0; i < end; i++) {
yield parseInt(10 * (i + Math.random()))
}
}
for (let n of iterator02(10)) {
console.log(n)
}
let numbers = [...iterator02(20)];
let [a, b, c, ...others] = iterator02(8);
console.log(numbers);
console.log(a, b, c);
console.log(others)