Object.assign()和深拷贝
Object.assign()对象的拷贝
Object.assign() ⽅法⽤于将所有可枚举属性的值从⼀个或多个源对象复制到⽬标对象。它将返回⽬标对象。
Object.assign(target, ...sources)    【target:⽬标对象】,【souce:源对象(可多个)】
举个栗⼦:
const object1 = {
a: 1,
b: 2,
c: 3
};
const object2 = Object.assign({c: 4, d: 5}, object1);
console.log(object2.c, object2.d);
console.log(object1)  // { a: 1, b: 2, c: 3 }
console.log(object2)  // { c: 3, d: 5, a: 1, b: 2 }
注意:
1.如果⽬标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后⾯的源对象的属性将类似地覆盖前⾯的源对象的属性
2.Object.assign ⽅法只会拷贝源对象⾃⾝的并且可枚举的属性到⽬标对象。该⽅法使⽤源对象的[[Get]]和⽬标
对象的[[Set]],所以它会调⽤相关 getter 和 setter。因此,它分配属性,⽽不仅仅是复制或定义新的属性。如
果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到
原型,应使⽤OwnPropertyDescriptor()和Object.defineProperty() 。
View Code
Object.assign()对象的深拷贝
针对深拷贝,需要使⽤其他办法,因为 Object.assign()拷贝的是属性值。假如源对象的属性值是⼀个对象的引⽤,那么它也只指向那个引⽤。
let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj1.a = 1;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
最后⼀次赋值的时候,b是值是对象的引⽤,只要修改任意⼀个,其他的也会受影响
// Deep Clone (深拷贝)
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
View Code
合并具有相同属性的对象
const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };
const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
1.属性被后续参数中具有相同属性的其他对象覆盖。
2.⽬标对象的属性与源对象的属性相同,源的会覆盖⽬标的属性
View Code
Object.assign()拷贝
当对象中只有⼀级属性,没有⼆级属性的时候,此⽅法为深拷贝,但是对象中有对象的时候,此⽅法,在⼆级属性以后就是浅拷贝。
使⽤递归的⽅式实现深拷贝
function _deepClone(source) {
let target;
if (typeof source === 'object') {
target = Array.isArray(source) ? [] : {}
for (let key in source) {
if (source.hasOwnProperty(key)) {
if (typeof source[key] !== 'object') {
target[key] = source[key]
} else {
target[key] = _deepClone(source[key])        }
}
}
} else {
target = source
}
return target
}
View Code
使⽤js实现深拷贝
function deepClone(data) {
let _data = JSON.stringify(data),
dataClone = JSON.parse(_data);
return dataClone;
};
js assignView Code

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。