
深拷贝和浅拷贝的区别
发布日期:2021-05-04 12:34:15
浏览次数:29
分类:原创文章
本文共 1444 字,大约阅读时间需要 4 分钟。
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝(修改堆内存中的不同的值)
深拷贝和浅拷贝的区别
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。
深拷贝实例
JavaScript中两个变量用等于进行值传递的赋值操作就是浅拷贝,为了节省机器内存空间,大部分都是使用浅拷贝。
深拷贝的特点
使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。
拓展:关于浅复制与深复制
浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
浅拷贝与深拷贝实例:
let object = { name:"李广程",age:21}; // 浅拷贝 let shallowCopy = object; // 深拷贝 function deepClone(obj) { // 判断是否是对象,不是对象,返回结果(返回值类型) // obj == null判断了null和undefined两种情况 null==undefined if (typeof obj !== 'object' || obj == null) { return obj } // 初始化结果数据,如果是数组赋值为[],否则为{} let result = Array.isArray(obj) ? [] : { } for (let key in obj) { // 判断是否是自己的属性方法,而不是原型属性方法 // 如果是递归复制 if (obj.hasOwnProperty(key)) { result[key] = deepClone(obj[key]) } } return result } let deepCopy = deepClone(obj); // 结果 console.log("被拷贝的数据:",object); console.log("浅拷贝:",shallowCopy); console.log("深拷贝:",deepCopy); // 修改被拷贝的数据 console.log("-------------------- 修改被拷贝的数据 --------------------"); object.address = "深圳"; // 结果 console.log("被拷贝的数据:",object); console.log("浅拷贝:",shallowCopy); console.log("深拷贝:",deepCopy);
运行结果:
浅拷贝与深拷贝实现原理
浅拷贝:
拷贝原数据中 栈内存 指向 堆内存 中 的 指针地址 。故修改原数据的值的时候,拷贝的值和被拷贝的值是相同的。
深拷贝:
首先在内存中开辟一个新的空间,然后将原数据拷贝到新的空间。修改原数据的时候,拷贝的值和被拷贝的值是不同的。