返回
Generator的巧妙之处(为ES6而重学(六))
前端
2024-01-12 01:18:23
在ES6发布之前,Javascript语言的执行环境是“单线程”(single thread)。Javascript语言将任务的执行模式分成两种:同步任务(task)和异步任务(task)。同步任务会立即执行,异步任务则会推迟到之后执行。
Generator是ES6中新引入的一种控制语句,可以将一个函数改写成一个迭代器(iterator),可以像C++中的foreach一样,在函数中以Iterator的方式遍历一个集合类型。它可以让我们以一个更简洁的写法,来实现迭代的遍历集合的功能。
Generator 的特点
- Generator 可以被暂停执行(被冻结),并可以在任意之后继续执行。
- 执行过程中如果遇到 return,则会返回这个 return 语句的 value,且暂停继续执行之后,下一次再执行执行时会从上次 return 语句的位置开始执行。
- 执行过程中 if、for、try等语句,直接执行这些语句。
- Generator 本身不是 Iterator,需要被激活才可以迭代。
实例
function* generator() {
yield 1;
yield 2;
yield 3;
}
var result = [];
for (var i of generator()) {
result.push(i);
}
console.log(result); // [1, 2, 3]
Generator 内部嵌套,无需 while 循环,直接利用内部 return、yield 的配合,在函数外部逐步完成循环的每一个迭代。代码更容易理解,更简洁。
Set 和 Map 都是ES6中新引入的数据类型。Set 和 Map 是两种完全类型不兼容的数据类型:Set 元素只能是其它类型(主要为对象),Map 的元素为键值对(key-value)。它能更高效的操作集合(集合包含的一般是对象),最常见的是用 Set 来替代现存的去重标志位,Map 来替代现存的键值对数据类型。
Set
Set 允许将任意值,包括其他数据类型,作为元素进行集合操作。Set 可以对元素进行去重操作,返回的结果类型是 Set。
ES6中提供了Set内建对象,这是一个无序元素的集合。
Map
ES6中Map是无序键值对的集合。Map 类型本质上是弱类型,即它允许你以任何类型的值作为键或值,这不同于Array、Set和Queue类型。它类似于java中 的HashMap。
实例
const a = new Set([1, 2, 3, 4, 5]);
console.log(a.size); // Set 的 size 等于元素的数量,为5
const b = new Set([[1, 2], ['a', 1], ['b', 2]]);
console.log(b.size); // Map 的 size 等于元素的数量,为3
const c = new Map([[1, 2], ['a', 1], ['b', 2]]);
console.log(c.size); // Map 的 size 等于元素的数量,为3
Proxy 是 ES6 中引入的一个新的内置对象,它主要用在需要在JS层面做一些调整修改时。
Proxy实例
const proxy = new Proxy(obj, {
get(target, prop) {
return target[prop] + 1;
}
});
var obj = { a: 1, b: 2, c: 3 };
var result = proxy.a + proxy.b + proxy.c;
console.log(obj.a); // 1
console.log(result); // 6