ES6知识点

1.作用域隔离:es6作用域隔离采用一对花括号{}来隔离,而es3/es5采用立即执行函数((function(){})())进行作用域隔离;

2.this的指向:es6中的this是定义时this的指向,而es3/es5中this指向的是被调用者的对象,如下例子:

//ES6
{
    var factory = function(){
        this.a = 'a';
        this.b = 'b';
        this.c = {
            a:'A+',
            b:()=>{
                return this.a;
            }
        };
    }
    console.log(new factory().c.b());//打印出 a。因为调用的b()函数里的this指向的是函数b定义时的factory函数体中的this,即factory本身
}

//ES3/ES5
{
    var factory = function(){
        this.a = 'a';
        this.b = 'b';
        this.c = {
            a:'A+',
            b:function(){
                return this.a;
            }
        };
    }
    console.log(new factory().c.b());//打印出 A+。因为调用的b()函数里的this指向的是b()函数被调用的对象c,所以b()函数的this.a返回的是c对象里的a

}

3.默认参数、必填参数的写法:

//ES3/ES5 默认参数的写法,另外必选参数也是采用这种方式,if判断然后提示必填的信息
{
    function f(x,y,z){
        if(y===undefined){
            y=7;
        }
        if(z===undefined){
            z=42;
        }
        return x+y+z;
    }
    console.log(f(1,3));//46   1+3+42=46
}
//ES6 默认参数的写法
{
    function f(x,y=7,z=42){
        return x+y+z;return x+y+z;
    }
    console.log(f(1,3));//46   1+3+42=46
};
//ES6必选参数写法
{
    function checkParameter(){
        throw new Error('can\'t be empty!');
    };
    function fn(x=checkParameter(),y=7,x=42){
        return x+y+z;
    };
    console.log(fn(1));//50  1+7+42
    // fn();
    //捕获异常处理
    try {
        fn();//参数为空时,会报异常
    } catch (error) {
        console.log(error);
    }
}

4.可变参数,ES6使用...扩展运算符,而ES3/ES5使用arguments

//ES3/ES5 传递可变参数的写法
{
    // function fn(x){
    //     console.log(x);
    // }
    // console.log(fn(1,2,3));//1
    function fn(){
        var a = Array.prototype.slice.call(arguments);//arguments是伪数组
        var sum=0;
        a.forEach(function(item){
            sum += sum*1;
        });
        return sum;
    }
    console.log(fn(1,2,3));//6
}
//ES6 传递可变参数的写法
{
    function fn(...a){
        var sum=0;
        a.forEach(item=>{
            sum += sum*1;
        });
        return sum;
    }
    console.log(fn(1,2,3));//6
}

 5.合并数组:ES6使用...扩展运算符,ES3/ES5使用concat():

//ES5合并数组写法
{
    var arr = ['hello',3,true];
    var other = [1,2].concat(arr);
    console.log(other);//[1,2,'hello',3,true]
}
//ES6合并数组写法
{
    var arr = ['hello',3,true];
    var other = [1,2,...arr];
    console.log(other);//[1,2,'hello',3,true]
}

6.对象代理,对对象数据的保护

//数据保护,对象代理
//ES3对象数据保护的写法
var Person = function(){
    var data={
        name:'Jom',
        age:19,
        sex:'male'
    }
    this.get=function(key){
        return data[key];
    }
    this.set=function(key,value){
        if(key!=='sex'){
            data[key] = value;
        }
    }
}
var person = new Person();
console.log("ES3:",person.get('name'));//Jom
person.set('name','张三')
person.set('sex','female')
console.log(person.get('name'));//张三
console.log(person.get('sex'));//male  此修改无效,因为sex受保护不可修改
//ES5对象数据保护的写法
var Person = {
    name:'Rose',
    age:19
}
Object.defineProperty(Person,'sex',{
    value:'male',
    writable:false
});
console.log("ES5:",Person.name);
try {
    Person.sex='female';
    console.log(Person.sex);//male 此修改无效
} catch (error) {
    console.log(error);
}
//ES6对象数据保护的写法
let Person1 = {
    name:'Baby',
    age:30,
    sex:'female'
}
let Per = new Proxy(Person1,{
    get(target,key){
        return target[key]
    },
    set(target,key,value){
        target[key] = value
    }
});
console.log("ES6:",Per.name);//Baby
try {
    Per.sex='female';
    console.log(Per.sex);//male 此修改无效
} catch (error) {
    console.log(error);
}

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页