目录
异步与等待
async 异步
async作为一个关键字放到函数前面,用于表示函数是一个异步函数。async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。
// 用 asyc 装饰函数 返回的是promise对象
async function say() {
return "你好ES6"
}
say()
.then(res => console.log(res))
console.log(say());
运行结果:
个人理解:用async装饰了say方法,所以使用say方法返回的是一个Promise对象。而Promise对象可以用.then来调用,于是在控制台输出了“你好ES6”。
await 等待
async 函数中可能会有await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。
await 关键字仅在 async function 中有效。如果在 async function 函数体外使用 await ,你只会得到一个语法错误。
function say(msg, time) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(msg), time)
})
}
// 2秒后说你好
// 3秒后说很高兴认识你
// 定义async函数
async function doit() {
// await会等待say函数执行完之后再向下执行
var msg1 = await say("你好", 2000)
console.log(msg1);
var msg2 = await say("很高兴认识你", 3000)
console.log(msg2);
return msg1 + msg2
}
doit()
.then(res => console.log(res))
运行结果:
个人理解:先创建了一个say方法,say方法有两个形参,返回的是一个promise对象。async装饰了doit方法,里面的msg1后面的await等到了两秒之后的promise对象并返回了promise的运行结果,于是程序运行了两秒之后,控制台输出了“你好”,接下来msg2如法炮制,又过了三秒后,控制台输出了“很高兴认识你”和“你好很高兴认识你”
Symbol 符号
Symbol 是一种新的数据类型,它的值是唯一的,不可变的
迭代器
迭代器允许每次访问数据集合的一个元素,当指针指向数据集合最后一个元素时,迭代器便会退出。它提供了 next() 函数来进行迭代,这个方法返回一个包含 done 和 value 属性的对象。
可迭代对象都拥有迭代器(可以被for of遍历的对象都是可迭代对象)String Array Set Map
var arr = [7,8,9]
// 获取数组的迭代器
var itr = arr[Symbol.iterator]()
这是使用了next函数,可以看出返回值是一个对象,value是当前迭代的对象。当数组遍历完之后,value的值是undefined,done的值是true
生成器
Generator 函数是 ES6 的新特性,它允许一个函数返回的可遍历对象生成多个值。
在使用中你会看到 * 语法和一个新的关键词 yield
- 普通函数前面添加 *
- 通过yield关键字来控制生成
- 最终函数执行 返回一个可迭代元素
function* gen() {
// 当生成器函数语言碰到yield 函数就会暂停,返回值
yield "aaa";
yield "bbb";
yield "ccc";
}
// 执行完毕生成的是迭代器
var list = gen();
// list.next();
// 可以通过next方法获取yield返回的值和状态
// 遍历迭代器
for (let v of list) {
console.log(v)
}
运行结果:
proxy 代理
- Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。
- Proxy(target, handler), 这里的 handler 可以是 set get has hasOwn keys 等等方法
// 代理就是对原有对象target 二次加工
var obj = {"name":"小菜粥",age:18};
// 用o来代理obj
var o = new Proxy(obj,{
// 当获取o对象的属性值执行get方法
get:function(target,prop){
// 如果属性名在原对象里面
if(prop in target){
// 返回原对象属性
return target[prop]
}else{
// 否则返回 "不在
return "不在";
}
},
set:function(target,prop,value){
if(prop==="age"){
if(value>200||value<0){
// 发送一个(范围)错误
throw RangeError('这个年龄恐怕不是人类!')
}else{
target[prop] = value;
}
}else{
target[prop] = value;
}
}
})
o.xx 会执行get方法
o.xx = "yy" 会执行set方法
欢迎大佬指正给予建议