美文网首页
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