美文网首页
ES6中扩展运算符的使用对数组的简化操作

ES6中扩展运算符的使用对数组的简化操作

作者: 宋乐怡 | 来源:发表于2018-07-17 15:45 被阅读0次

    Q1: 求数组中最大值
    js中不提供求数组最大元素的函数,Math,.max也不接受数组作为参数
    apply 接受数组参数,把数组参数拆开,做了[args] -> arguments的动作

    //ES6
    Math.max(...[1,22,567,34,22])
    //等同于
    Math.max(1,22,567,34,22)
    //ES5的做法
    Math.max.apply(null,[1,22,567,34,22])
    

    Q2:将一个数组push到另一个数组

    //ES6
    let arr1  = [0,1,2];
    let arr2 = [3,4,5];
    arr1.push(...arr2);
    //ES5
    Array.prototype.push.apply(arr1.arr2);
    

    Q3 复制数组
    数组是复合的数据类型,直接复制的话,只是复制 了指向底层数据结构的指针,而不是克隆一个全新的数组
    concat不改变原数组,返回两个数组连接之后的新数组,ES5使用猥琐的方法复制数组

    //ES6
    const a1 = [1,2];
    //方式一
    const a2 = [...a1];
    //方式二
    const [...a2] = a1;
    //ES5
    const a2 = a1.concat();
    

    Q4: 合并数组
    这两种方法都是浅拷贝,因为他们的成员是对原数组的引用,如果修改了原数组的成员,会同步反映到新数组。

    const arr1 = [1,2,3];
    const arr2 = [4,5,6];
    const arr3 = [7,8,9];
    //ES6
    [...arr1,...arr2,...arr3];
    //ES5
    arr1.concat(arr2,arr3);
    

    Q5: 与结构赋值结合,用于生成数组
    数组的slice(from,end)方法,从原数组截取from到end(不包含)的元素,返回一个新的数组。

    //ES6
    [a,...rest] = list;
    //ES5
    a = list[0],
    rest = list.slice(1);
    

    Q6: 字符串转为数组

    [..."hello"]
    // [ "h", "e", "l", "l", "o" ]
    

    Q7: 将类数组对象转化为真正的数组
    实现了Iterator接口的对象可以用扩展运算符转为真正的数组
    没有实现Iterator接口的类数组对象可以用Array.from转为真正的数组

    //实现了Iterator的对象
    let nodeList = document.querySelectorAll('div');
    let array = [...nodeList];
    //未实现Iterator的对象
    let arrayLike = {
      '0' : 'a',
      '1' : 'b',
      '2' : 'c',
      length: 3
    };
    let arr = [...arrayLike];
    // TypeError: Cannot spread non-iterable object.
    let arr = Array.from(arrayLike);
    //ES5
    var arr = [].slice.call(arrayLike);
    

    Q8:Map和Set结构,Generator函数
    扩展运算符内部调用的是数据结构的Iterator接口,只要具有Iterator接口的对象,都可以使用扩展运算符。
    Generator函数运行后,返回一个遍历器对象,因此也可以是用扩展运算符。

    let map = new Map([
     [1, 'one'],
      [2, 'two'],
      [3, 'three'],
    ]);
    let arr = [...map.keys];//[1,2,3]
    //Generator
    const go = function*(){
      yield 1;
    yield 2;
    yield 3;
    };
    [...go()] //[1,2,3]
    

    相关文章

      网友评论

          本文标题:ES6中扩展运算符的使用对数组的简化操作

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