ES6补充-异步与等待、符号、迭代器、代理以及生成器

目录

异步与等待

async 异步

await 等待

Symbol 符号

迭代器

生成器

 proxy 代理


异步与等待

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方法


欢迎大佬指正给予建议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值