• 技术文章 >web前端 >js教程

    一起来聊聊ES6中的扩展运算符

    长期闲置长期闲置2022-08-08 14:47:25转载97
    本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于扩展运算符的相关问题,S6的扩展运算符,它的语法很简单,使用三个点号表示“...”。可以将一个数组转为用逗号分隔的参数序列,下面一起来看一下,希望对大家有帮助。

    【相关推荐:javascript视频教程web前端

    ES6的扩展运算符,它的语法很简单,使用三个点号表示“...”。可以将一个数组转为用逗号分隔的参数序列。

    它将可迭代对象展开到其单独的元素中,所谓的可迭代对象就是任何能用 for of 循环进行遍历的对象,例如:数组、字符串、MapSetDOM节点等。

    基础语法

    var array = [1,2,3,4];
    console.log(...array);//1 2 3 4 
    var str = "String";
    console.log(...str);//S t r i n g

    该运算符主要用于函数调用

    function push(array, ...items) {
      array.push(...items);
    }
    function add(x, y) {
      return x + y;
    }
    const numbers = [4, 38];
    add(...numbers) // 42

    上面代码中,array.push(...items)add(...numbers)这两行,都是函数的调用,它们都使用了扩展运算符。该运算符将一个数组,变为参数序列。

    扩展运算符后面还可以放置表达式

    const arr = [
      ...(x > 0 ? ['a'] : []),
      'b',
    ];

    如果扩展运算符后面是一个空数组,则不产生任何效果。

    [...[], 1]
    // [1]

    扩展运算符还有许多用法...

    一、 替代数组的 apply 方法

    使用 Math.max() 函数来获取最大值的用法是:

    const m = Math.max(1, 2, 3); //结果为3

    使用 apply 方法结合 Math.max():

    但如果要计算数组里的最大值,显然数组是不能直接作为 Math.max() 的参数,我们需要把它展开。在ES6之前,我们也是需要结合apply来处理:

    var arr = [2, 4, 8, 6, 0];
    function max(arr) {
     return Math.max.apply(null, arr);
    }
    
    console.log(max(arr));

    ES6使用扩展运算符(...)就很简单就可以展开,上面的例子变为:

    var arr = [2, 4, 8, 6, 0];
    console.log(Math.max(...arr));  // 3

    二、扩展运算符的应用

    1. 合并数组

    扩展运算符给了我们全新的合并数组的方法

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

    使用扩展运算符就可以很简单地把数组展开为参数列表

    const a1 = [{ foo: 1 }];
    const a2 = [{ bar: 2 }];
    const a3 = a1.concat(a2);
    const a4 = [...a1, ...a2];
    a3[0] === a1[0] // true
    a4[0] === a1[0] // true

    上面代码中,a3a4是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了引用指向的值,会同步反映到新数组。

    注意:这两种方法都是浅拷贝,使用的时候需要注意。

    2. 拷贝数组

    数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。

    ES5 只能用变通方法来复制数组。

    const a1 = [1, 2];
    const a2 = a1.concat();
    a2[0] = 2;
    a1 // [1, 2]

    上面代码中,a1会返回原数组的克隆,再修改a2就不会对a1产生影响。

    扩展运算符提供了复制数组的简便写法。

    //拷贝数组
    var array0 = [1,2,3];
    var array1 = [...array0];
    console.log(array1);//[1, 2, 3]
    
    //拷贝数组
    var obj = {
        age:1,
        name:"lis",
        arr:{
            a1:[1,2]
        }
    }
    var obj2  = {...obj};
    console.log(obj2);//{age: 1, name: "lis", arr: {…}}

    记住:数组仍通过指针得到,所以我们并没有复制数组本身,我们复制的只是一个新的指针。

    3. 将伪数组转换为数组

    NodeList 对象是节点的集合,通常是由属性,如 Node.childNodes 和方法,如 document.querySelectorAll 返回的。

    像 NodeList 和 arguments 这种伪数组,类似于数组,但不是数组,没有 Array 的所有方法,例如findmapfilter 等,但是可以使用 forEach() 来迭代

    可以通过扩展运算符将其转为数组,如下:

    const nodeList = document.querySelectorAll(".row");
    const nodeArray = [...nodeList];
    console.log(nodeList);
    console.log(nodeArray);

    注意:使用扩展运算符将伪数组转换为数组有局限性,这个类数组必须得有默认的迭代器且伪可遍历的

    4.与解构赋值结合

    扩展运算符可以与解构赋值结合起来,用于生成数组

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

    下面是另外一些例子:

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

    注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

    const [...butLast, last] = [1, 2, 3, 4, 5];
    //  报错
    const [first, ...middle, last] = [1, 2, 3, 4, 5];
    //  报错

    5. 字符串

    ES6的扩展语法可以很简单的把一个字符串分割为单独字符的数组:

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

    6.Map 和 Set 结构,Generator 函数

    扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。

    let map = new Map([
      [1, 'one'],
      [2, 'two'],
      [3, 'three'],
    ]);
    let arr = [...map.keys()]; // [1, 2, 3]

    Generator 函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。

    var go = function*(){
    yield 1;
    yield 2;
    yield 3;
    };
    [...go()] // [1, 2, 3]

    上面代码中,变量go是一个 Generator 函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。

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

    const obj = {a: 1, b: 2};
    let arr = [...obj]; // TypeError: Cannot spread non-iterable object

    【相关推荐:javascript视频教程web前端

    以上就是一起来聊聊ES6中的扩展运算符的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:ES6
    上一篇:深入理解NodeJs异步编程的含义 下一篇:归纳整理ES6中的class类知识点
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• es6怎么删除数组中的某一个对象• es6怎么求数组中的奇数和• es6是什么机构制定的• es6中有继承吗• 一文快速详解ES6~ES12的全部特性!
    1/1

    PHP中文网