ES6 - 函数的扩展

1.函数默认参数

2.函数参数默认已经定义,不能在使用let,const声明

3.箭头函数

1) (参数)=> return的值

2) (参数)=>{语句 return的值 }

注意:

1) this问题:this指向定义时所在的对象,而不是使用时所在的对象。

箭头函数里面没有自己的this,而是引用外层的this。

2) 箭头函数没有arguments,用 '...'

3) 箭头函数不能成为构造函数

4.扩展运算符(rest运算符)

1. 展开: [1,2,3,4] -> ...[1,2,3,4] -> 1,2,3,4

2. 收起: 1,2,3,4 -> ... 1,2,3,4 ->[1,2,3,4]

3. 剩余参数:必须放到最后

//1. 函数默认参数

function test({a=0,b=0}={}){
    console.log(a,b);
}
test({a:10,b:20});//10 20
test({b:20});//0 20
test({});//0 0
test();//0 0

// 2.函数参数默认已经定义,不能在使用let,const声明

function test(a){
    let a=123; //error:Identifier 'a' has already been declared
    console.log(a);
}
test(1);

 

// ================箭头函数============================

// 1. (参数)=> return的值
let test=(a,b)=>a+b;
console.log(test(1,2));//3

// 2. (参数)=>{语句  return }

let test=(a=0,b=0)=>{
    console.log(a+b);
    return a+b;
}
test(3,4);//7
test();//0

// 3.this问题:定义时所在的对象,而不是使用时所在的对象。
        
var id = 21;
function foo() {
    setTimeout(() => {
        console.log('id:', this.id);//this 指向函数foo的this
    }, 100);
}

foo.call({ id: 42 });//42

// 箭头函数里面没有自己的this,而是引用外层的this。
function foo() {
    console.log(this);//{id: 1}
    return () => {
        return () => {
            return () => {
                console.log(this);//this:是函数foo最外层的this
                console.log('id:', this.id);
            };
        };
    };
}

var f = foo.call({id: 1});
var t1 = f.call({id: 2})()(); //1
var t2 = f().call({id: 3})(); //1
var t3 = f()().call({id: 4});//1


// 4.箭头函数没有arguments,用 '...'

let test=()=>{
    console.log(arguments);//error:arguments is not defined
}
test(1,2,3);

let test1=(...a)=>{
    console.log(a);// [1, 2, 3]
}
test1(1,2,3);

//5.箭头函数不能成为构造函数

let Test=()=>{
    this.name='assd';
    console.log(this.name);
}
let test=new Test();//Test is not a constructor

 

// ================扩展运算符(rest运算符)=====================

// 1.收起  1,2,3,4,5 -> ...a -> [1, 2, 3, 4, 5]
function test(...a){
    console.log(a); //数组 [1, 2, 3, 4, 5]
}
test(1,2,3,4,5);

// 2.展开 ...[1,2,3] -> 1 2 3
function test1(a,b,c){
    console.log(a,b,c); //1 2 3
}
test1(...[1,2,3]);

// 3.剩余运算符
function test2(a,b,...c){
    console.log(a,b); //1 2 
    console.log(c); //[3, 4, 5]
}
test2(1,2,3,4,5);

//4.数组复制,不影响原数组
let arr=[1,2,3,4,5];
let arr1=[...arr];
console.log(arr==arr1);//false

let arr2=Array.from(arr);//从一个类似数组或可迭代对象中创建一个新的数组实例。
console.log(arr==arr2);//false


// 5.rest参数代替 arguments
function test(){
    return Array.prototype.slice.call(arguments).sort();
}
console.log(test(4,2,1,3)); //[1,2,3,4]

let test2=(...a)=>{
    console.log(a);// [4, 2, 1, 3]
    return a.sort();
}
console.log(test2(4,2,1,3)); //[1,2,3,4]

 

posted @ 2018-08-23 11:29  yuesu  阅读(166)  评论(0编辑  收藏  举报