-
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
-
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
-
浅拷贝的实现方式
-
1.Object.assign()
-
let obj1 = { person: {name: "kobe", age: 41},sports:'basketball' }; let obj2 = Object.assign({}, obj1); obj2.person.name = "wade"; obj2.sports = 'football' console.log(obj1); // { person: { name: 'wade', age: 41 }, sports: 'basketball' }
2.函数库lodash的_.clone方法
-
var _ = require('lodash'); var obj1 = { a: 1, b: { f: { g: 1 } }, c: [1, 2, 3] }; var obj2 = _.clone(obj1); console.log(obj1.b.f === obj2.b.f);// true
3.展开运算符...
-
let obj1 = { name: 'Kobe', address:{x:100,y:100}} let obj2= {... obj1} obj1.address.x = 200; obj1.name = 'wade' console.log('obj2',obj2) // obj2 { name: 'Kobe', address: { x: 200, y: 100 } } 作者:浪里行舟 链接:https://juejin.cn/post/6844904197595332622 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
深拷贝的实现方式
-
1.JSON.parse(JSON.stringify())
-
let arr = [1, 3, { username: ' kobe' }]; let arr4 = JSON.parse(JSON.stringify(arr)); arr4[2].username = 'duncan'; console.log(arr, arr4)
这种方法虽然可以实现数组或对象深拷贝,但不能处理函数和正则
-
2.函数库lodash的_.cloneDeep方法
-
var _ = require('lodash'); var obj1 = { a: 1, b: { f: { g: 1 } }, c: [1, 2, 3] }; var obj2 = _.cloneDeep(obj1); console.log(obj1.b.f === obj2.b.f);// false
手写深拷贝
-
function Clone(val){ if(typeof val !== 'object' || val ==null){ return val; } let obj; if(val instansof Array){ obj =[] }else{ obj = {}; } for (var key in val){ if(val.hasOwnProperty(key)){ obj[key] = Clone(val[key]) } } return obj } var a ={b:[1,2,3,{c:[4,5,{d:'helloword'}]}]} var b= Clone(a) console.log(b)
浅拷贝与深拷贝
最新推荐文章于 2024-07-08 19:01:49 发布