美文网首页
ES6之rest参数和拓展运算符

ES6之rest参数和拓展运算符

作者: lionlsc | 来源:发表于2018-10-22 20:50 被阅读0次

    1.rest参数

    ES6引入了rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入其中。

    function add(...values) {
            let sum=0;
            for (let item of values){
                sum+=item;
            }
            return sum;
        }
        console.log(add(2, 4, 6, 8, 10));   //控制台输出30;
    

    以上代码中的add函数是一个求和函数,利用rest参数可以向该函数传入任意数目的参数。
    rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子

    function push(array,...rest) {
            rest.forEach(function (value) {
                array.push(value);
            })
        }
        let a=[];
        push(a,1,2,3,4,5);
        console.log(a);
    
    push.PNG
    注意:rest参数之后不能再有其他参数(即只能是最后一个参数),否则会报错
    补充:从ES5开始,函数内部可以设定为严格模式。
     function doSomething(a,b) {
            'use strict';
            //
        }
    

    ES2016做了一点修改,规定函数参数只要使用了默认值解构赋值或者拓展运算符,那么函数内部就不能显式设定为严格模式,否则就会报错。这样规定的原因是,函数内部的严格模式同时适用于函数体和函数参数。但是,函数执行时,先执行函数参数,然后再执行函数体。这样就有一个不合理的地方:只有从函数体之中才知道参数是否以严格模式实行,但是参数却应该先于函数体执行。有两种方法可以规避这种限制

    1.设定全局性的严格模式,这是合法的

    'use strict';
        function doSomething(a,b=a) {
            //code
        }
    

    2.把函数包在一个无参数的立即执行函数里面

    const doSomething=(function () {
          'use strict';
          return function (value=42) {
              return value;
          }
        }());
        console.log(doSomething());;     //控制台输出42
    

    2.拓展运算符

    扩展运算符( spread )是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。

        console.log(...[1, 2, 3])           //控制台输出1 2 3
        console.log(1, ...[2, 3, 4], 5)   //控制台输出1 2 3 4 5
    

    如果对没有iterator接口的对象,使用扩展运算符,将会报错。

    拓展运算符的一些简单应用
    • 合并数组
    // ES5
    [1, 2].concat(more)
    // ES6
    [1, 2, ...more]
    var arr1 = ['a', 'b'];
    var arr2 = ['c'];
    var arr3 = ['d', 'e'];
    // ES5 的合并数组
    arr1.concat(arr2, arr3);
    // [ 'a', 'b', 'c', 'd', 'e' ]
    // ES6 的合并数组
    [...arr1, ...arr2, ...arr3]
    // [ 'a', 'b', 'c', 'd', 'e' ]
    
    • 字符串
    console.log([...'hello']);
        // [ "h", "e", "l", "l", "o" ]
    
    • 实现了 Iterator 接口的对象
      任何 Iterator 接口的对象,都可以用扩展运算符转为真正的数组。
      例如map转为数组:
    const map=new Map([
    
        ['name','张三'],
    
        ['title','Author']
    
    ])
    
    let arr=[...map];
    
    console.log(arr);
    
    1.PNG
    • 替代数组的apply方法
      下面是拓展运算符取代apply方法的实际例子:应用Math.max方法简化求出一个数组中的最大元素
           //ES5的写法
           Math.max.apply(null,[14,3,77]);
           //ES6的写法
           Math.max(...[14,3,7]);
           //等同于
           Math.max(14,3,77);
    

    相关文章

      网友评论

          本文标题:ES6之rest参数和拓展运算符

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