ES6的学习(3)

120 阅读1分钟

ES6

Promiss

定义

执行异步任务,避免回调地狱

.then和.catch方法

    p.then(res=>console.log(res))
    .catch(err=>console.log(err))

其他

Promise.race([...]).then()异步列表中最resolve的值

封装Promise

    say("msg",500)
    .then(res=>{
       console.log(res)
      return say("abc",123)
    })
    .then(res=>console.log(res))

实例

    <script>
        function say((msg,time)=>{
			setTimeout(()=>resolve(msg),time)
		})
		say("你好",2000)
		.then(res=>{
			console.log(res);
			return say("你踩着我尾巴了",3000)
		})
		.then(res=>console.log(res))
    </script>

异步与等待

async

  1. async装饰的函数返回的是一个promise对象
    async function say(){
	return "hello ES6"
    }
    say()
    .then(res => console.log(res))
    typeof(async)

await

  1. await只能在async函数中使用
  2. 当函数遇到await等待await结果,再往下执行
    // await只能在async函数中使用
    function say(msg,time){
	return new Promise((resolve,reject) => {
            setTimeout(() => resolve(msg),time)
            })
    }
		
    // 2秒后 你好呀
    // 2秒后 我很中意你
		
    // 定义async函数
    async function doit(){
    // await会等待say函数执行完才会执行
        var s1  = await say ("你好呀",2000);
        console.log(s1);
			
        var s2 = await say("我很中意你",2000);
        console.log(s2);
			
        return s1+s2;
    }
    doit()
    .then(res => console.log(res))    

Symbol

  1. 符号;不重复;不可修改
  2. var sym = Symbol("标识")
  3. 可以是sym作为唯一的key或者标识符{sym:"abc"}

迭代器

  1. 可迭代对象都拥有迭代器(可以被for of 遍历对象都是可迭代对象) String Array Set Map
  2. 获取迭代对象
    var itr = arr[Symbol.iterator]()
  1. 通过next方法进行迭代
    //itr.next()
    {value:"xxx",done:false}
    {value:undefined,done:true}>

生成器

  1. 普通函数前面添加 *,通过yield关键来控制生成,最终函数执行,返回一个可迭代元素
   function *range(start,end,step=1){
       while(start<step){
           yield start;
           start+=step;
       }
    } 
  1. 当函数执行到yield关键字会等待

代理 prxoy

  1. 对原对象操作的劫持
  2. o.msg 会执行get方法,o.msg=“abc” 会执行set方法,我们可以在get和set方法里面做一些判断劫持等其他操作
  3. console.log(o.msg),获取o的msg值,执行o代理里面的get方法,return obj["msg"]
  4. 实例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>代理</title>
</head>
<body>
    
    <script>
        var obj = {"name":"chen",age:16};
	// 用a来代理obj
	var a = new Proxy(obj,{
            // 对o进行get方法
            get:function(target,prop){
                // 如果属性名在对象里面
                if(prop in target){
                    // 返回原对象数组
                    return target[prop]
		}
		// 否则返回"没有"
		else{
                    return "没有";
		} 
		// return target[prop]
            },
                                                               set:function(target,prop,value){
                if(prop == "age"){
                    if(value > 200 || value < 0){
                                                                           throw RangeError("年龄范围为0~200")
                    }
                    else{
                                                                          target[prop] = value;
						
                    }
					
                  }
                  else{
                                                                        target[prop] = value;
					
                  }
                }
            })
    </script>
</body>
</html>