定义
Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
🌰
var obj = {};
var o1 = { a: 1, b: 1 };
var o2 = { b: 2 };
var obj = Object.assign(obj, o1, o2);
console.log(obj); // { a: 1, b: 2 }
注意:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性
深拷贝还是潜拷贝?
- 对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互印象。
- 对象的深拷贝:简单理解深拷贝是将对象放到新的内存中,两个对象的改变不会相互影响。
举例一
var obj1 = {name: 'd'} var obj2 = {age: 23} Object.assign(obj1,obj2) obj2.age = 29 console.log(obj1) // {name: "d", age: 23}
上面可看出修改了obj2 的值并没有修改到目标对象,看起来是深拷贝
举例二
var obj1 = {name: 'd'} var obj2 = {age: {year: 2019}} Object.assign(obj1,obj2) obj2.age.year = 2020 console.log(obj1) // {name: "d", age: {year: 2020}}
修改了obj2 的值,同时也修改到目标对象,看起来是潜拷贝
总结:对于Object.assign()而言,如果对象的属性值为简单类型(string,number),通过Object.assign({},srcobj);得到的新对象为深拷贝;如果属性值为对象或其他引用类型,那对于这个对象而言其实是浅拷贝的,这是Object.assign()特别需要注意的地方。
手写深拷贝:
function clone(target) {
if (typeof target === 'object') {
let cloneTarget = Array.isArray(target) ? [] : {};
for (const key in target) {
cloneTarget[key] = clone(target[key]);
}
return cloneTarget;
} else {
return target;
}
};