首页 > 其他 > 详细

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

时间:2020-09-12 22:45:44      阅读:64      评论:0      收藏:0      [点我收藏+]

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

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

Object.assign() 方法:用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 并且源对象也会被修改

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);
// expected output: Object { a: 1, b: 4, c: 5 }
console.log(returnedTarget);
// expected output: Object { 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);

 

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

原文:https://www.cnblogs.com/huxiuxiu/p/13658071.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!