简述浅拷贝和深拷贝的区别,浅拷贝深拷贝哪个是原地操作

首页 > 经验 > 作者:YD1662022-10-24 22:53:14

我们修改李明的年龄的时候,小明的年龄也跟着发生改变了,这不是我们预期的结果。所以这时候就需要用深拷贝或浅拷贝来进一步处理了。

let person = {}, xiaoming = person, liming = person; (xiaoming.age = 12), (liming.age = 18); console.log(xiaoming.age, liming.age); // 18 18

简述浅拷贝和深拷贝的区别,浅拷贝深拷贝哪个是原地操作(1)


先了解一下引用类型:它是一种数据结构,在JavaScript也可以称为对象定义,它描述一类对象所具备的属性和方法。存放在堆内存里,保存的是一个指针,常见的引用类型: Array、Object。

//1 Object构造函数 let person = new Object(); console.log(person); // {} // 2 对象字面量 let person = {} // let arr = new Array(); let arrr = [];


浅拷贝:按位拷贝,复制了空间,不复制资源。对对象拷贝,遇到基本数据类型,拷贝值,遇到引用类型拷贝的是内存地址(还是会受到影响)。
  1. Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

2. 缺点:二级(引用类型)还是会受到影响,如下:

let obj_1 = { a: 1, c: { b: 2 } }; let obj_2 = Object.assign({}, obj_1); console.log(obj_2); //=> { a: 1, c: { b: 2 } } //尝试修改obj_1 obj_1.c.b = 10; obj_1.a = 6; // a不受影响,b受影响 console.log(obj_1); // => { a: 6, c: { b: 10 } } console.log(obj_2); //=> { a: 1, c: { b: 10 } }


深拷贝: 重新开辟了空间进行深度复制,互不影响。
  1. JSON.parse(JSON.stringify())
  1. 递归

let obj_1 = { a: 1, c: { b: 2 } }; function deepClone(obj) { let obj_1 = {}; for (const key in obj) { if (Object.prototype.toString.call(obj[key]) === "[object Object]") { obj_1[key] = deepClone(obj[key]); } else { obj_1[key] = obj[key]; } } return obj_1; } let obj_2 = deepClone(obj_1); console.log(obj_2); //=> { a: 1, c: { b: 2 } } //尝试修改obj_1 obj_1.c.b = 10; obj_1.a = 6; obj_2.a = 2; obj_2.c.b = 12; // 互不影响 console.log(obj_1); //=> { a: 6, c: { b: 10 } } console.log(obj_2); //=> { a: 2, c: { b: 12 } }

我是爱美的姑娘,关注我,每天为您分享和复习前端开发的知识点、学习的同时还可以了解最新的娱乐八卦、幽默搞笑,学习更轻松哟!

简述浅拷贝和深拷贝的区别,浅拷贝深拷贝哪个是原地操作(2)

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.