es6-函数扩展以及扩展运算符

函数扩展以及扩展运算符

故心故心故心故心小故冲啊



一、函数扩展

 //函数扩展
    //函数默认参数
    //ES5写法
    function fun(x,y){   
        y = y || '10';
        console.log(x,y);
    };
    fun(123);

    //ES6写法(减少代码的数量) 参数变量是默认声明的,所以不能用let或const再次声明。
    function fun(x,y ="10"){   
        console.log(x,y);
    };
    fun(123);

    //rest参数  用法:...变量名  注意:用于形参上面,获取函数的多余参数
    //ES6 引入 rest 参数(形式为`...变量名`),用于获取函数的多余参数,这样就不需要使用`arguments`对象了
    function fun(...item){
        //console.log(arguments[1])
        console.log(item)   // [1, 2, 3, 4, 5, 6]
    };
    fun(1,2,3,4,5,6)

    //注意,rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。
    function fun(a,...b){
        console.log(a);  //1
        console.log(b);  //[2,3,4]
  }
  fun(1,2,3,4)

  //扩展题一
  function fun(a,b,...c){
        c.push(a);
        console.log(c);   //[3, 4, 1]
    }
    fun(1,2,3,4)
    //扩展题二   求参数的和
    function add(...values){
        var sum = 0;
        for(var v of values){   //values[i]
            sum+=v;
        };
        return sum;
    };
    var n = 10;
    var a = 20;
    add(n,1,2,3,4,5,a,7,8)


    //箭头函数   简化函数的定义
    let f = v => v;    //变量名 = 参数 => 函数体
    var f = function(v){
        return v
    }
    
    //当参数为空时或者参数多个时需要写()
    //参数为空
    let f = () => 12345;
    var f = function(){
        return 12345
    }

    //参数多个
    let f = (n1,n2) => n1+n2;
    var f = function(n1,n2){
        return n1+n2
    }

    //由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号,否则会报错。
    // 报错
    let getTempItem = id => { id: id, name: "Temp" };
    // 不报错
    let getTempItem = id => ({ id: id, name: "Temp" });
    
    //经常使用
    var a = [1,2,3,4].filter(function(item){
        return item>3
    });
    var a = [1,2,3,4].filter(item=>item>3);

    //默认值
    function fun(x,y ="10"){   
        console.log(x,y);
    };
    var fun = (x,y='10')=>{console.log(x,y)}

    //解构
    function move({x = 0, y = 0} = {}) {   
            return [x, y];
    }
    var move = ({x = 0, y = 0} = {})=>[x, y];

    move({x: 3, y: 8}); 

    //rest参数
    var fun = function(...item){
       return item
    };
    var fun = (...item) => item;
    fun(1,2,3,4,5)

    //扩展题   如果函数体返回对象,添加()
    function fun(a,b){
        return {name:a,id:b}
    };
    fun(1,2);

    var fun =(a,b) => ({name:a,id:b});
    fun(1,2);


    //注意点
    //1、箭头函数不能当作构造函数, 不可以使用new 命令
    //箭头函数中,this指向固定化,本身是没有自己的this,所以不能用作构造函数
    var Fun = ()=>{
        this.name = '1'
    };
    var f1 = new Fun()   //Fun is not a constructor

    //2、箭头函数没有原型 对象
    function fun(){}
    fun.prototype;
    
    var fun2 =()=>{}
    fun2.prototype;

    //3、不可以使用arguments对象  该对象在函数体内不存在   替代 rest
    var fun = ()=>{
        console.log(arguments[1]) //arguments is not defined
    };
    fun(1,2,3);
    //替代 rest
    var fun = (...item)=>{
        console.log(item[1]) 
    };
    fun(1,2,3);

    //4、this指向   由于箭头函数不绑定this,它会捕获其所在上下文的this的值,作为自己的this值(函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。)
    var str = 'global';
    var obj = {
        str:'private',
        getStr:function(){
            console.log(this.str)
        }
    };
    obj.getStr();   //运行者(调用者)为obj,  this指向obj
    var a = obj.getStr;
    a();  //global


    var str = 'global';
    var obj = {
        str:'private',
        getStr:()=>{
            console.log(this.str)  //绑定的是定义者
            //箭头函数的表现为getStr的value,它在obj对象中,obj的执行上下文就是window,
            //this.str 实际就是window.str  输出‘global’
        }
    };
    obj.getStr();   //global


    //call()   apply()  bind() 对于this毫无影响
    var n = 10;
    function f(){
        return this.n
    };
    var obj ={
        n:8,
        f2:f
    };
    var obj2 = {
        n:99
    }
    console.log(obj.f2.call(obj2));   //99

    //箭头函数
    var n = 10;
    var f=()=> this.n;
    var obj ={
        n:8,
        f2:f
    };
    var obj2 = {
        n:99
    }
    console.log(obj.f2.call(obj2));  //10

    

二、扩展运算符

 //...扩展运算符   将一个数组转为用逗号分隔的参数序列
    //1、数组合并
    let arr1 = [0, 1, 2];
    let arr2 = [3, 4, 5];
    //arr1.concat(arr2);
    let arr3 = [...arr1,...arr2];  //
   // ...[1,2,3]  = 1,2,3
   //或者直接arr1.push(...arr2); 
   
   //2、参数
   function add(x, y) {
        return x + y;
    }
    const numbers = [4, 5];
    add(...numbers) 

    //3、rest参数与扩展运算符的结合
    function f(...items) {   //...items    rest参数
        console.log(items);  //[-1,0,1,2,3]
        console.log(...items);  //-1,0,1,2,3
    }
    const args = [0, 1];
    f(-1, ...args, 2, ...[3]);   //f(-1,0,1,2,3)


    const [first, ...rest] = [1, 2, 3, 4, 5];
    first // 1
    rest  // [2, 3, 4, 5]


    //ES5  在字符串中的应用 
    var s1 = "hello";
    console.log(s1.split(''));
    //ES6的用法
    [...'hello']   //['h','e','l','l','o']

    //深浅拷贝
    //深拷贝
    let a = [1,2];
    let a2 = [...a];
    a2[0] = 100;
    console.log(a);

    //对象中的运用
    let o1 = {id:1};
    let o2 = {name:2};
    let o3 = {...o1,...o2};  //{id:1,name:2};
    let o4 = {...o1,o2}; //{id:1,o2:{name:2}};


    let fun = () => 123;
    let obj4 = {...o3,fun};
   //相当于
    obj4 = {
        id:1,
       name:2,
       fun:function(){
           return 123
       }
   }

总结

函数扩展:

1.es6的写法相比于大大减少了代码量

2.rest参数 …变量名 用于获取函数的多余参数,只能作为最后一个参数,否则报错

3.箭头函数 ()=>{} 当参数为空时或者参数多个时需要写()

注意点:
(1)、箭头函数不能当作构造函数,不可以使用new 命令.
箭头函数中,this指向固定化,本身是没有自己的this,所以不能用作构造函数
(2)、箭头函数没有原型 对象
(3)、不可以使用arguments对象 该对象在函数体内不存在 替代 rest
(4)、this指向 由于箭头函数不绑定this,它会捕获其所在上下文的this的值,作为自己的this值
(5)、箭头函数中call() apply() bind() 对于this毫无影响


扩展运算符:

1…扩展运算符 将一个数组转为用逗号分隔的参数序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值