ES6补充

作者: 无尾树袋熊 | 来源:发表于2020-03-21 00:54 被阅读0次

    常变量关键字

    • 定义变量,常量
    //不会覆盖, 并且不允许重复定义
    //let定义的变量不会预解析
    console.log(num);
    let num;
    const num = 666;
    
    • ES6开始新增了一种作用域, 叫做代码块
    • 通过let定义的变量受到代码块的限制, 只能在所属的作用域中使用
    • 注意点:
      • 常量不能修改
      • 常量必须在定义的时候初始化
      • 常量的指向不能改变,但指向内存中的数据可以改变
    const arr = [1, 2];
    //arr = [2, 4]; //报错
    arr[0] = 666;
    arr.push(777);
    console.log(arr); //666,2,777
    

    字符串模板

    • 添加字符串
    var str = `
    <li>${obj.name}</li>
    <li>${obj.age}</li>
    <li>${obj.say()}</li>
    `
    oUl.innerHTML = str;
    
    • 新增字符串想关方法
    var str = "www.hate996.com";
    var res1 = str.includes("996");
    var res2 = str.startsWith("www");
    var res3 = str.endsWith("com");
    

    解构数组和对象

    数组

    • 依次将数组中的内容赋值给等号左边[]中的变量
    var arr = [1, 2, 3];
    //a=1, b=2, c=3
    let [a, b, c] = arr;
    
    • 如果等号右边的数组和等号左边的内容不对等,没有的就是undefined
    //a=undefined,b=2,c=undefined
    let [a, b, c] = [, 3, ];
    
    • 解构数组的时候,可以指定默认值
    //a=666,b=2,c=undefined
    let [a=666, b, c] = [, 2, ];
    

    对象

    • 会将对象中和属性名称和解构中变量名称一致的赋值给解构的变量
    let obj = {
        name: "yz",
        age: 18
    };
    <!--name=yz,age=18,gender="male"-->
    let{name, age, gender="male"} = obj; 
    
    • 应用场景
    //简化代码
    let obj = {
        name: "yz",
        age: 18
    };
    say(obj);
    function say({name, age}){
        console.log(name, age);
    }
    
    • 高级使用
    var arr = [
        {name:"yz", age:18},
        {name:"zx", age:15},
        {name:"zx", age:10},
    ];
    let [{name},{age}] = arr;
    //name=yz,age=15
    console.log(name, age);
    

    函数的默认参数

    function sat(name = "yz", age = -1){
        console.log(name, age);
    }
    <!--name=yz,age=-1-->
    say();
    
    • 应用场景

    某一个函数的某些参数永远都是一些固定的值,获取用于都是通过其它函数获得的,那么就可以使用默认参数

    function Car(id){
        this.id = id;
    }
    function creatCar(id = getRandom()){
        return new Car(id);
    }
    function getRandom(){
        return Math.random() * 10000;
    }
    var c1 = creatCar();
    console.log(c1);
    

    扩展运算符

    • 可变参数的注意点:可变参数必须在参数列表的最后
    function sum(a, ...ags){
        //a=10,ages=arr(2)
        console.log(a, ags);
        var sum = 0;
        for(var i = 0, len = ags.length; i < len; i++){
            sum += ags[i];
        }
        return sum;
    }
    //50
    console.log(sum(10, 20, 30));
    
    • 会将数组中的元素逐个取出来赋值给形参
        var arr = [1, 2, 3, 4, 5];
        var res = sum(...arr);
        console.log(res); //15
    
        function sum(...ags){
            var sum = 0;
            for(var i = 0, len = ags.length; i < len; i++){
                sum += ags[i];
            }
            return sum;
        }
    
    • 合并数组
    var arr1 = [1, 3, 5];
    var arr2 = [2, 4, 6];
    //ES6之前:
    //var res = arr1.concat(arr2);
    var res = [...arr1, ...arr2];
    //[1, 2, 3, 4, 5, 6]
    console.log(res);
    

    箭头函数

    • 格式:
      • let 函数名称 = (形参列表) => {函数体}
    • 作用:简化代码,修改函数中的this
    • 注意点:
      • 如果函数体中只有一句代码, 那么{}可以省略
      • 如果函数形参列表中只有一个形参, 那么()可以省略
      • 如果函数体中只有一句代码, 并且是返回值,那么return可以省略
    let say1 = () => console.log("hello");
    let say2 = name => console.log(name);
    let num = (a, b) => a + b;
    

    this

    • ES6没有this这个概念,会从所在的作用域链的上一层继承this
    • 应用场景:让setTimeout/setInterval中的this变为我们想要的this
    //ES6之前
    setTimeout(function () {
        console.log(this);// window
    }, 1000);
    //ES6之后
    setTimeout(()=>{
        console.log(this); // Person
    }, 1000);
    
        function Student() {
            this.age = 666;
            // this.say = function () {
            //     // 谁调用就是谁
            //     // 可以被call/apply/bind方法修改
            //     console.log(this);
            // }
            this.say = ()=>{
                // 从上一级的作用域继承
                // 不可以被call/apply/bind方法修改
                // 因为箭头函数自己没有this
                // 因为箭头函数中的this只看定义, 不看调用
                console.log(this);
            }
        }
        var stu = new Student();
        stu.say();
        // stu.say.call({name:"zs"});
    
    • 箭头函数中不能使用arguments
    let test = () => console.log(arguments);
    test(1, 3, 5);//报错
    

    增加对象字面量

    function creatPerson(name, age){
        var obj = {
            name,
            age,
            say(){
                console.log(name, age);
            }
        }  
        return obj;
    }
    var p = creatPerson("yz", 18);
    p.say();
    

    ES6的类

    • ES6开始提供了一个关键字, 专门用于定义类 class
    class Person{
        // 构造函数, 创建对象时系统会默认执行
        constructor(name, age){
            this.name = name;
            this.age = age;
        }
        say(){
            console.log(this.name, this.age);
        }
        static eat(){
            console.log("吃饭");
        }
    }
    let p = new Person("zx", 18);
    p.say();
    p.eat();
    

    ES6的继承

    • 在子类后面添加extends 类名
    class Person{
        constructor(name, age){
            this.name = name;
            this.age = age;
        }
        say(){
            console.log(this.name, this.age)
        }
    }
    class Student extends Person{
        constructor(name, age, score){
            //利用super将父类的属性传递给父类
            super(name, age);
            this.score = score;
        }
        eat(){
            console.log("吃饭");
        }
        //在ES6中,可以重写父类的方法
        say(){
            console.log(this.name, this.age, this.score);
        }
    }
    let s = new Student("zx", 18, 99);
    s.eat();
    s.say();
    

    相关文章

      网友评论

        本文标题:ES6补充

        本文链接:https://www.haomeiwen.com/subject/asyeyhtx.html