1.拓展运算符(对象数组都能用)
-
拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象
-
let bar = { a: 1, b: 2 }; let baz = { ...bar }; // { a: 1, b: 2 } -
上述方法实际上等价于
-
let bar = { a: 1, b: 2 }; let baz = Object.assign({}, bar); // { a: 1, b: 2 } -
可用于合并两个对象
-
let age = {age: 15}; let name = {name: "Amy"}; let person = {...age, ...name}; person; //{age: 15, name: "Amy"} -
自定义的属性和拓展运算符对象里面属性的相同的时候:自定义的属性在拓展运算符后面,则拓展运算符对象内部同名的属性将被覆盖掉。
-
let person = {name: "Amy", age: 15}; let someone = { ...person, name: "Mike", age: 17}; someone; //{name: "Mike", age: 17} -
自定义的属性在拓展运算度前面,则变成设置新对象默认属性值
-
let person = {name: "Amy", age: 15}; let someone = {name: "Mike", age: 17, ...person}; someone; //{name: "Amy", age: 15}
1.1拓展运算符的个人补充
- 首先拓展运算符在对象和数组里都能用,但是写法不太一样,注意和要复制的格式保持一致
- 拓展运算符用在对象上的时候,和Object.assign是一样的效果,而且两者也有同一个特性,就是有的时候是深克隆,有的时候是浅克隆
1.2 拓展运算符和Object.assign到底是深克隆还是浅克隆(也叫深拷贝和浅拷贝)
- 深克隆和浅克隆的定义,自己学习,他们有个区别,就是如果b复制了a,如果是浅克隆,改变b,a也会变化,如果是深克隆,改变b,a不会变化
- 就拿拓展运算符举例,如果b复制a之后,b改变的是基本数据类型(不知道基本数据类型和引用数据类型的,自行百度),那么此时b复制的这个属性就是深克隆,a不会受影响,b改变的是引用数据类型,那么此时b复制的这个属性就是浅克隆,a会受影响
2.解构赋值(对象数组都能用)
2.1 数组的解构赋值
-
解构赋值是对赋值运算符的扩展,他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
-
基本 let [a, b, c] = [1, 2, 3]; // a = 1 // b = 2 // c = 3 -
可嵌套 let [a, [[b], c]] = [1, [[2], 3]]; // a = 1 // b = 2 // c = 3 -
可忽略 let [a, , b] = [1, 2, 3]; // a = 1 // b = 3 -
不完全解构 let [a = 1, b] = []; // a = 1, b = undefined -
剩余运算符 let [a, ...b] = [1, 2, 3]; //a = 1 //b = [2, 3] -
字符串等 let [a, b, c, d, e] = 'hello'; // a = 'h' // b = 'e' // c = 'l' // d = 'l' // e = 'o' -
还有其他情况,不过不常见,就不举例了
2.2 对象的解构赋值
-
基本 let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; // foo = 'aaa' // bar = 'bbb' let { baz : foo } = { baz : 'ddd' }; // foo = 'ddd' -
可嵌套可忽略 let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { y }] } = obj; // x = 'hello' // y = 'world' let obj = {p: ['hello', {y: 'world'}] }; let {p: [x, { }] } = obj; // x = 'hello' -
不完全解构 let obj = {p: [{y: 'world'}] }; let {p: [{ y }, x ] } = obj; // x = undefined // y = 'world' -
剩余运算符 let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}; // a = 10 // b = 20 // rest = {c: 30, d: 40} -
解构默认值 let {a = 10, b = 5} = {a: 3}; // a = 3; b = 5; let {a: aa = 10, b: bb = 5} = {a: 3}; // aa = 3; bb = 5;