灏天阁

生成器

· 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)

- Book Lists -