(...)es6运算符的用法笔记

前言:

...是es6出的新规范,这个东西不是像其他的方法一样,用法只用一种;
但是可以把这个运算符的操作归为一类:解构!

1、比如做数组的赋值

    let a = [1, 2, 3, 4];
    let b = a;
    b.push(5);
    console.log(a);     // [1, 2, 3, 4, 5]
    console.log(b);     // [1, 2, 3, 4, 5]
    // 这里因为数组对象存储的引用地址,这里改变b的引用位置的值;
    // 因为a的引用地址和b是相同的,所以a输出的值也是被改变过的;
    
    // 我们使用扩展运算符做深拷贝
    let a = [1, 2, 3, 4];
    let b = [...a];
    b.push(5);
    console.log(a);     // [1, 2, 3, 4]
    console.log(b);     // [1, 2, 3, 4, 5]
    // 这里为什么a的输出没有新添加的5呢???
    // 首先我们看a,a = [],代表在内存空间中给a创建了一个数组对象,并且数组中存储着这几个值,
    // 而b呢??我们也看到了b = [],这句话告诉我们b也新建了一个对象,b对象中存储什么了呢???
    // 我们看到b对象中有一个...a,我说过这是解构,他的结果就是1, 2, 3, 4,我们把这些值放到b的对象中;
    // 所以b的对象中就有这些值了,这是是一个新对象,和a没有任何关联。这就实现了深拷贝。
    
    // 对象的解释也是一样的哦,这里我们给出代码
    let a = {a: 1, b: 3};
    let b = {...a};
    b.c = 3;
    console.log(a);     // {a: 1, b: 3}
    console.log(b);     // {a: 1, b: 3, c: 3}

2、 合并数组

(1)在es6之前,我们只能通过concat()方法进行合并数组,代码比较冗余;如下:

    let arr1 = ['a', 'b'];
    let arr2 = ['c'];
    let arr3 = ['d', 'e'];
    arr1.concat(arr2, arr3);
    console.log(arr1);  // [ 'a', 'b', 'c', 'd', 'e' ]

(2)合并数组es6的实现方法:

    let arr1 = ['a', 'b'];
    let arr2 = ['c'];
    let arr3 = ['d', 'e'];
    let arr = [...arr1, ...arr2, ...arr3]
    console.log(arr);   // [ 'a', 'b', 'c', 'd', 'e' ]

解说:首先我们看到有三个要合并的数组,然后let arr = [],首先创建了一个数组对象数组对象里面存储的什么呢???
存储的是...arr1, ...arr2, ...arr3,我们一步一步的进行解构
// ...arr1, ...arr2, ...arr3
// 'a', 'b', ...arr2, ...arr3
// 'a', 'b', 'c', ...arr3
// 'a', 'b', 'c', 'd', 'e'
我们把解构结果放到arr中,最终arr的值为['a', 'b', 'c', 'd', 'e']
(3)对象是一样的哦,我们看一下代码:

    let obj1 = {a: 1, b: 2};
    let obj2 = {c: 3, d: 4, a: 10};
    let obj = {...obj1, ...obj2};   // {a: 10, b: 2, c: 3, d: 4}
    // 这里如果两个对象中有相同的值,则后面覆盖前面,如这个,后面的a: 10,则覆盖前面的a: 1,所以最终a为10

3、方法赋值

(1)这里我们使用一个方法Math.max(),这个方法可以传入任意多个参数,他会把最大的数字返回给你,例如:

    let max = Math.max(1, 34, 89, 100, 33);
    console.log(max);       // 100
    let arr = [12, 56, 100, 392, 55, 12, 34];
    let max = Math.max(...arr);
    console.log(max);       // 392

    // 这里我们使用解构的思路来看一下传入的值是什么
    // ...arr
    // 12, 56, 100, 392, 55, 12, 34
    
    // 上面的写法等同于如下
    let max = Math.max(12, 56, 100, 392, 55, 12, 34);
    // 所以他就能取到最大值了

4、与解构取值一起使用

    let arr = [1, 2, 3, 4, 5, 6, 7]
    let [a, ...list] = arr;
    console.log(a);     // 1
    console.log(list);  // [2, 3, 4, 5, 6, 7]
    
    
    let obj = {a: 10, b: 2, c: 3, d: 4};
    let { a } = obj;
    console.log(a);     // 10

    let obj = {b: 2, c: 3, a: 10, d: 4};
    let { a } = obj;
    console.log(a);     // 10

    let obj = {a: 10, b: 2, c: 3, d: 4};
    let { a, ...obj1 } = obj;
    console.log(obj1);  // {b: 2, c: 3, d: 4}

    let obj = {b: 10, c: 2, a: 3, d: 4};
    let { a, ...obj1 } = obj;
    console.log(obj1);  // {b: 10, c: 2, d: 4}
    // 对象没有顺序,但是有键值,只要键值符合,就能取出来,而数组有序,是根据顺序取值的