ES6(常用的、重点的)

模板字符串

模板字符串的基本用法

    //基本用法
    var s1 = ` abc `
    var s2 = " abc "
    //模板字符串解决了一些痛点:
    //字符串拼接
    var s3=" a "+s1+" b "+s2;
    var s4=` a ${s1} b ${s2}`
    var s5=`<div>
                <p>
                    <span>222</span>
                    <span>${s1}</span>
                    <span>${s2}</span>
                </p
            </div>
            `

解构赋值

对象的解构赋值

    var obj={name:"张三",age:18}

    var {name,age}=obj; 
    //生成2个变量,
    //  name值来自于obj.name、
    //  age值来自于obj.age

    var {name:title}=obj;
    //生成一个变量:title,值来自于obj.name

函数参数的解构赋值

    function f1(obj){
        console.log(obj.age);
        console.log(obj.height)
    }
    //等价于
    function f1({ age,height }){
        console.log(age);
        console.log(height)
    }

    f1({age:5,height:180})

补充:属性的简写

    var a = 3 ; 
    var c = 10;
    var b = { a,c } ;   
    //b对象有一个a属性,a属性的值,来自于a变量  ,
    //还有一个c属性,c属性的值来自于c变量
    console.log(b);//{a: 3, c: 10}

函数的扩展

rest参数

  • 使用背景:es6的
  • 优点:arguments是伪数组,而rest参数是真数组

          function fn(...args){
              //验证args是不是数组?
              console.log(args instanceof Array);//true
              console.log(Object.prototype.toString.call(args));//[object Array]
              console.log(Array.isArray(args));
              console.log(args);  //数组:[1,2,3,4,5]
          }
          fn(1,2,3,4,5)
    
  • 判断数据类型

    • typeof只能判断:数字、字符串、布尔、undefined、函数
    • Object.prototype.toString.call()
    • Array.isArray()
    • isNaN()
    • isInfinity()

箭头函数

  • 场景:用于替换匿名函数
  • 基本用法:

          //匿名函数
          div.onclick=function(){
              console.log("你好")
          }
          //箭头函数
          div.onclick=()=>{
              console.log("你好")
          }
    
  • 有一个参数的箭头函数

          var fn=(a)=>{
              console.log("abc");
          }
          //等价于:
          var fn=a=>{
              console.log("abc");
          }
    
  • 有2个及更多参数的箭头函数

          var f=(a,b,c)=>{
              console.log("abc")
          }
    
  • 箭头函数和普通匿名函数有哪些不同?

    • 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
    • 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
    • 不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
    • (不常用)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。

      • generator函数现在经常用async替代
      var p={
          age:18,
          run:()=>{
              setTimeout(()=>{
                  console.log("run",this);//this指向window
              },100)
          },
          say(){
              setTimeout(()=>{
                  console.log("say",this);//this指向p
              },100)
          },
          //推荐使用的方式
          travel:function(){
              setTimeout(()=>{
                  console.log("travel",this);//this指向p
              },100)
          }
      }
      

对象的扩展

  • Object.assign:实现拷贝继承

      var source={age:18,height:170,className:"三年级"};
      var newObj=Object.assign({},source);
    
  • 对象扩展运算符

          var obj1={ age:5,gender:"男" }
          var obj2={ ...obj1 }
          var obj3={ ...obj1 , age:10 }
          var s1=[1,3,5,7,9];
          var s2=[...s1];
    

Promise

为什么要有promise:解决回调地狱的问题

回调地狱

    $.get("/getUser",function(res){
        $.get("/getUserDetail",function(){
            $.get("/getCart",function(){
                //...
            })
        })
    })

    function f1(){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                console.log("第一步");
                //异步执行完毕,必须告诫外界执行结束
                resolve();
            },1000)
        })
    }
    function f2(){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                console.log("第二步");
                //到这里异步操作就已经结束了,如何让外界得知
                resolve();
            },1000)
        })
    }
    f1().then(res=>{
        //return promise对象
       return f2();
    }).then(res=>{
        setTimeout(()=>{
            console.log("结束");
        },1000)
    })

Promise函数基本用法

    var promise=new Promise((resolve,reject)=>{
        $.get("/getUser",res=>{
            resolve(res)
        })
    })
    promise.then(res=>{
        console.log(res);
    })

Promise函数实现多层回调

    new Promise((resolve,reject)=>{
        $.get("/getUser",res=>{
            resolve(res)
        })
    }).then(res=>{
        //用户基本信息
        return new Promise(resolve=>{
            $.get("/getUserDetail",res=>{
                resolve(res)
            })
        })
    }).then(res=>{
        //用户详情
        return new Promise(resolve=>{
            $.get("/getCart",res=>{
                resolve(res)
            })
        })
    }).then(res=>{
        //购物车信息
    })

Promise函数错误处理

  • 第一种方式

          new Promise((resolve,reject)=>{
              $.ajax({
                  url:"/getUser",
                  type:"GET",
                  success:res=>{
                      resolve(res);
                  },
                  error:res=>{
                      reject(res)
                  }
              })
          }).then(resSuccess=>{
              //成功的返回值
          },resError=>{
              //失败的返回值
          })
    
  • 第二种方式(推荐使用这一种,reject的错误和代码发生的粗误都可以捕捉到)

          new Promise((resolve,reject)=>{
              $.ajax({
                  url:"/getUser",
                  type:"GET",
                  success:res=>{
                      resolve(res);
                  },
                  error:res=>{
                      reject(res)
                  }
              })
          }).then(resSuccess=>{
              //成功的返回值
          }).catch(resError=>{
              //失败的返回值
          })
    

async

await可以执行异步操作,但是await必须在async函数内执行

    function f1(){
        return new Promise((resolve)=>{
            setTimeout(()=>{
                console.log("第一步");
                //异步执行完毕,必须告诫外界执行结束
                resolve();
            },1000)
        })
    }
    (async function(){
        await f1();
        console.log("第二步");
    })()

    async function get(){
        console.log('开始执行');
        var res = await timer()
        console.log('执行结束:',res);
    }
    function timer(){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve("你好");
            },1000)
        })
    }
    get();

错误处理,只能使用try-catch

    function q(){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject("你好");
            },1000)
        })
    }
    (async function(){
        try{
            let res=await q();
            console.log(res);
        }catch(e){
            console.log(e);
        }
    })()

class

定义一个类

    class Person {
        constructor(name,age) {
            this.name=name;
            this.age=age;
        }
    }
    //相当于:
    function Person(name,age){
        this.name=name;
        this.age=age;
    }

添加实例方法

    //不使用class添加实例方法
    function Person(){

    }
    Person.prototype.run=()=>{
        console.log("run");
    }
    //使用class添加实例方法
    class Person {
        constructor(name,age) {
            this.name=name;
            this.age=age;
        }
        //定义方法
        say() {
            console.log("大家好,我叫:"+this.name+",今年:"+this.age+"岁");
        }
        travel(){
            console.log("坐着飞机去巴厘岛");
        }
    }

添加静态方法

    class Animal {
        constructor(){

        }
        static age=18;
        static born(){
            console.log("小呆萌出生了")
        }
    }
    //访问静态方法
    Animal.born();
    console.log(Animal.age);

类的继承

    class Person {
        constructor(name){
            this.name=name;
        }
    }
    class Student extends Person {
        constructor(name,grade){
            super(name);    //调用父类构造函数
            this.grade=grade;
        }
    }

module

基本用法

  • 导出模块:

          //common.js
          export default { name:"abc" }
    
  • 导入模块:

          //b.js
          import common from "common.js"
    
          console.log( common.name ) //"abc"
    

模块有多个导出

    //person.js
    export const jim = { country :"France" }
    export const tony = { color:"gray" }
    //默认的导出
    export default { name:"abc" }
    //index.js
    import person , { jim , tony } from "person.js"

    //person:{ name:"abc" }
    //jim:{ country :"France" }
    //tony:{ color:"gray" }

模块导入导出取别名

    //person.js
    export const tony = { color:"gray" }
    export { tony as Tony }

    //index.js
    import { Tony } from "person.js"
    import { Tony as man} from "person.js"

    console.log(man)    //{ color:"gray" }

results matching ""

    No results matching ""