浅拷贝 深拷贝

news/2024/11/29 7:58:48/

数据类型

数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol) 和 对象数据类型

基本数据类型的特点:直接存储在栈(stack)中的数据

引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在 堆内存里

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的

浅拷贝只复制指向某个对象的指针,新旧对象还是共享同一块内存,修改新对象会改到原对象。

要是{name:“wn”,friend:{ age:18}} name是基本数据 修改 不会影响 friend 为引用数据 会改到原对象

但深拷贝会赋值一个一模一样的对象,新旧对象 不共享内存,修改新对象不会改到原对象。

浅拷贝方式

= 直接赋值

let a = {name: 'jack',age: 22,girlFriends:{first:  'lili',second: 'lisa',third:  'alice'}
}let obj = a;

Object.assign()

let a = {name: 'jack',age: 22,girlFriends:{first:  'lili',second: 'lisa',third:  'alice'}
}let obj = Object.assign({},a);
// 基本数据类型相当于深拷贝  复杂数据类型 是浅拷贝 一改同改

Array.prototype.concat()

let arr = [1,32,{name: 'jack'}];
let newArr = arr.concat();

Array.prototype.slice()

let arr = [1,32,{name: 'jack'}];
let newArr = arr.slice();

解构进行拷贝

对一维数组使用解构,进行拷贝,结果是深拷贝

let arr = [1, 2, 3];
let newArr = [...arr];

对多维数组使用解构,进行拷贝,结果是浅拷贝

let arr = [[1, 2, 3], [4, 5, 6]];
let newArr = [...arr];

深拷贝方式

JSON.parse(JSON.stringify()) – 不能处理函数

let arr = [1,2,{name:'jack'}];
let newArr = JSON.parse(JSON.stringify(arr));

手写递归

1

function deepCopy(newobj, oldobj) {for (var key in oldobj) {// 判断是否为复杂数据类型  数组    数组属于object所以在前面if (oldobj[key] instanceof Array) {newobj[key] = []deepCopy(newobj[key], oldobj[key])// 判断是否为复杂数据类型   对象} else if (oldobj[key] instanceof Object) {newobj[key] = {}deepCopy(newobj[key], oldobj[key])} else {newobj[key] = oldobj[key]}}
}
deepCopy({}, obj)

2

typeof [] == "object"
typeof {} == "object"
// 键值  形式 的数组[ ["0","1"],["1","2"] ]   所有转换成键值对   ""
Object.entries(["aa", "bb"])
Object.entries({ name: "andy", age: 18 })
// ========
function Copy(obj) {let targetObj = obj instanceof Array ? [] : {}for (const [k, v] of Object.entries(obj)) {targetObj[k] = typeof v == "object" ? Copy(v) : v}return targetObj
}let newObj = Copy(obj)

lodash库完成深拷贝

let obj = {name:'老虎',age:'18',hobby:['吃肉','睡觉']}let obj2 = _.cloneDeep(obj)   //使用lodash库的方法 cloneDeep

http://www.ppmy.cn/news/243772.html

相关文章

sm3与sm4

介绍: 国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 1. SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调…

卡奥斯开源社区六月创作之星挑战赛开始啦!

活动须知 发布优质文章争榜,获取专属勋章、流量扶持及奖励! 活动时间:6 月 1 日- 6 月 30 日 奖品发放:7月10日 参与方式 完成认证发布优质文章,选中相关活动标签,文章默认参与活动 文章要求 文章符合…

okta/sf平台实现saml2.0单点登录集成实战(详细步骤+完整代码)

目录 第一步:注册okta账号 第二步:配置okta应用信息 第三步:下载Idp.xml文件 第四步:okta特定配置 第五步:集成测试 基于SuccessFactors的单点登录实现 Github工程代码链接 小结 笔者以前写过一篇关于saml2.0单…

【无标题】-自用

rad表示弧度radian,deg表示角度degree; 1. 用基于轮廓的模版匹配,匹配到之后,会有一个参数输出目标与原模版相比旋转的角度。 2. 原图的左上角点和右下角点连线,再把旋转之后图的上角与下角连线,测量两条线…

使用mongo遇到一些需要查询的符合要求的数据,写sql

1.修改符合条件的数据 如果一个值在A数组中存在,那么修改该数据中B数组,只保留B数组中xxx db.user.find({account:"csbj"}).pretty() {"_id" : ObjectId("6139680bde8bcd0001beb194"),"id" : 813,"account" : "csb…

ubuntu

#关于win10下linux的启动记录; 惠普(暗影精灵)BIOS里BOOT Option 里选择OS BOOT manager ,Enter键选择windows或者ubuntu的启动顺序,将ubuntu设为第一,F10保存即可在启动后,提供windows或者ubuntu的系统选项…

硬盘坏了

1.今天打开电脑(联想E49),系统无法启动,一直显示的是如下图界面,我以为系统坏了,然后打算重装系统, 用的是老毛桃装机软件 2.用老毛桃U盘引导后,然而在磁盘树上却找不到硬盘,只显示了我的 U 盘&#xff0c…

ESXI6.7下直通硬盘给群晖步骤,RDM直通方式

1.进入ESXI6.7 web管理后台。开启SSH 2.点击存储,选择默认存储(ESXI安装硬盘)。复制位置地址备用 3.打开SSH工具,登录SSH。登录以后执行以下命令。 执行命令1: cd /vmfs/volumes/5fb14c74-5da1723a-c6a0-00e15a680bd8 /vmfs/volumes/5fb14…