前言:
...是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}
// 对象没有顺序,但是有键值,只要键值符合,就能取出来,而数组有序,是根据顺序取值的