1. 对象扩展(对象赋值)
(1)这里的…相当于Object.assign()方法
let obj = {a:1,b:2}
let copy = {...obj}
console.log(copy)//{a:1,b:2}
//等价于assign方法:
//参数1:被赋值的对象(目标对象),参数2:要赋值的对象(源对象)
let obj1 = Object.assign({},obj)
console.log(obj1)//{a:1,b:2}
(2)…进行的是对基本数据类型属性的深拷贝,修改拷贝后的对象不会影响源对象,改变引用类型数据浅拷贝,会受源数据影响
//基本数据类型
let obj = {a:1,b:2}
let copy = {...obj}
copy.b = 3
console.log(copy)//{a:1,b:3}
console.log(obj)//{a:1,b:2}
//引用类型
let obj1 = {attr:{name:'2'},arr:[1,2]}
let copy1 = {...obj1}
copy1.arr[0] = 3
copy1.attr.name = '1'
console.log(copy1)//{attr: { name: '1' } arr: [ 3, 2 ] }
console.log(obj1)//{attr: { name: '1' } arr: [ 3, 2 ] }
(3)属性合并覆盖
let obj = {a:1,b:2}
let cover = {...obj,...{a:3,c:10}}
console.log(cover)//{a:3,b:2,c:10}
(4)特殊例子----没有对对象里的对象进行深拷贝
let exobj = {a:10,b:11,c:{ctext:'text'}}
let expecail = {...exobj}
expecail.c.ctext = 'change'
console.log(expecail)//{ a: 10, b: 11, c: { ctext: 'change' } }
console.log(exobj)//{ a: 10, b: 11, c: { ctext: 'change' } }
2. 数组扩展
(1)数组转化为参数序列
//数组转化为参数序列[1,2]--->1,2
let arr = [1, 2];
function add(a, b) {
return a + b;
}
let result = add(...arr)
console.log(result) //3
(2)数组深拷贝
let arr = [1,2]
let arr2 = [...arr]
console.log(arr2) //[1,2]
(3)数组解构+…运算符
…运算字段只能放在末尾,不能放在开头和中间
let [first, second, ...res] = [1, 2, 3, 4, 5, 6]
// let [first, ...res, second] = [1, 2, 3, 4, 5, 6]//报错
// let [...res,first, second] = [1, 2, 3, 4, 5, 6]//报错
console.log(first) //1
console.log(second) //2
console.log(res) //[3,4,5,6]
(4) 将字符串转化为数组
let str = [...'hello']
console.log(str) //[ 'h', 'e', 'l', 'l', 'o' ]
(5)将数据结构转化为数组
//Map数据结构
let map = new Map([
['c', 3],
['d', 4]
])
console.log([...map.values()]); //[ 3, 4 ]
//Set数据结构
let set = new Set([1, 2, 3, 4])
console.log([...set]);//[1, 2, 3, 4]