Generator 函数特性
可以通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能
Generator 有两个区分于普通函数的部分:
- 一是在 function 后面,函数名之前有个 *
- 函数内部有 yield 表达式
- 其中 * 用来表示函数为 Generator 函数,yield 用来定义函数内部的状态
next()调用
一般情况下,next 方法不传入参数的时候,yield 表达式的返回值是 undefined 。当 next 传入参数的时候,该参数会作为上一步yield的返回值
done表示函数是否执行完,true执行完,否则false
value获取的是yield后面的值
return 方法
- return 方法返回给定值,并结束遍历 Generator 函数
- return 方法提供参数时,返回该参数;不提供参数时,返回 undefined
Reflect.ownKeys() 返回对象所有的属性,不管属性是否可枚举,包括 Symbol
“use strict”;开启严格模式,注意,严格模式下,set代理如果没有返回true,就会报错
async
<script>
async function name([param[, param[, ... param]]]) { statements }
// name: 函数名称。
// param: 要传递给函数的参数的名称。
// statements: 函数体语句。
</script>
特性
- async 函数中可能会有 await 表达式,async 函数执行时, 如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值
- await 关键字仅在 async function 中有效。如果在 async function 函数体外使用 await ,你只会得到一个语法错误
Proxy和Reflect
- Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async
函数的执行并返回解析值。非 Promise 对象:直接返回对应的值 - Proxy可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作
- Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的
- Proxy 对象由两个部分组成: target 、 handler 。在通过 Proxy 构造函数生成实例对象时,需要提供这两个参数。 target 即目标对象, handler 是一个对象,声明了代理 target 的指定行为
has用于拦截 HasProperty 操作,即在判断 target 对象是否存在 propKey 属性时,会被这个方法拦截。 此方法不判断一个属性是对象自身的属性,还是继承的属性。 true说明存在,false不存在
<script>
construct(target, args) 用于拦截 new 命令。返回值必须为对象
delete obj.b; 可删除b 因为时直接对obj操作,忽略proxy的限制
</script>