1 解构赋值的拷贝是浅拷贝,即如果一个键的值是复合类型的值(数组、对象、函数)、那么解构赋值拷贝的是这个值的引用,而不是这个值的副本。
let obj={a:{b:2}} let {...x} = obj obj.a.b=3 console.log(x.a.b) //3
2扩展运算符的解构赋值,不能复制继承自原型对象的属性。***
let o1={a:1} let o2={b:2} o2.__proto__=o1 let {...x} = o2 console.log(o2.a) // 1 console.log(x.a) // undefined 因为o1是o2的原型,所以x无法复制
***
const o=Object.create({x:1,y:2}) o.z=3 //o对象自身的属性是z,而x和y是原型上的属性 let {x,...newObj} = o x解构赋值可以得到o的属性x的值,但是newObj是扩展运算解构,并不会获取原型上的属性,所以newObj={z:3} let {y,z} = newObj console.log(x,y,z) //1,undefined,3
3 对象的扩展运算符等同于使用Object.assign()
方法。
Object.assign()
方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.assign()
拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。
let aClone = { ...a };
// 等同于
let aClone = Object.assign({}, a);