Object.assign()拷贝是深拷贝还是浅拷贝问题

什么是深拷贝,什么是浅拷贝?

  B复制A--A变B变,浅拷贝; B变A不变,深拷贝。

Object.assign(target, source) 方法:用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。

它将返回目标对象。 并且目标对象也会被修改,如果不想修改目标对象,可以将目标对象改成空 {}

let user = {name:'无敌人',age:19};
let page = {pageSize:10,currentPage:1};
let newObj = {};
Object.assign(newObj,user,page);
// newObj={name:'无敌人',age:19,pageSize:10,currentPage:1}
Object.assign(obj1,obj2)
obj1为主对象,obj2为被合并对象
合并完成之后重复的键值对将被删除
const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };
const returnedTarget = Object.assign(target, source);
console.log(target); // { a: 1, b: 4, c: 5 }
console.log(returnedTarget); // Object { a: 1, b: 4, c: 5 }
console.log(target) // {a: 1, b: 4, c: 5}
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
支持多个对象合并,如果不想修改目标对象,可以将目标对象改成空 {}, 例如:const returnedTarget
= Object.assign( {} , source,source);

Object.assign()拷贝:当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。

第一级是深拷贝:
let a = {James: {age: 18}}
let b = Object.assign({}, a)
b.James = 20
console.log(b) // { James: 20 }
console.log(a) // { James: { age: 18 } }
以后各级是浅拷贝:
let a = {James: {age: 18}
let b = Object.assign({}, a)
b.James.age = 20
console.log(b) // { James: { age: 20 } }
console.log(a) // { James: { age: 20 } } //源对象a也被修改

实现深拷贝的几种方法:

1.JSON.stringify 和 JSON.parse

2.Object.assign()拷贝第一级是深拷贝,以后各级是浅拷贝
3.通过jQuery的extend方法实现深拷贝
4.lodash.cloneDeep()实现深拷贝
let _ = require('lodash'); 
let obj1 = { a: 1, b: { f: { g: 1 } }, c: [1, 2, 3] };
let obj2 = _.cloneDeep(obj1);

 

posted @ 2020-09-12 19:09  胡柚柚学程序  阅读(1094)  评论(1编辑  收藏  举报