js浅拷贝与深拷贝

var value = 10;
var valueCopy = value;
valueCopy = 1000
console.log(value, valueCopy) // 10   1000

以上value结果的值没有随着valueCopy的改变而改变是因为数字,字符串是原始值,当重新给它赋值时不会在原地址修改而是新开一块地址
引用类型就是指向同一地址{}对象

1.浅拷贝: 只复制引用,而未复制真正的值(指向同一个地址数据,一个改变另一个也会改变)
直接赋值/Object.assgin()

var arr1 = [1,2,3,4,5];
var arr2 = arr1;
console.log(arr1, arr2) // [1,2,3,4,5]  [1,2,3,4,5]
arr1[0] = 'hello'
arr2[1] = 'jack'
console.log(arr1, arr2) // ['hello','jack',3,4,5]  ['hello','jack',3,4,5]var obj1 = {a:1, b:2}
var obj2 = Object.assign(obj1)
console.log(obj1, obj2) // {a:1, b:2}    {a:1, b:2}
obj1.a = 'hello'
obj2.b = 'jack'
console.log(obj1, obj2) // {a:'hello', b:'jack'}    {a:'hello', b:'jack'}

2.深拷贝:复制真正的值(一个改变互相不影响)
使用JSON.parse(JSON.stringty())/Object.assgin()/es6解构/自己封装函数赋值

2.1使用JSON.parse(JSON.stringty()),得到一个全新的{}对象,和之前的对象地址是不相连的
缺点:有些类型的值是不支持的,不支持undefinedNaNInfinity
var obj1 = {a: 1, b: 2}
var obj2 = JSON.parse(JSON.stringty(obj1))
console.log(obj1, obj2) // {a: 1, b: 2}     {a:1, b: 2}
obj1.a = 'hello';
obj2.b = 'jack'
console.log(obj1, obj2) // {a: 'hello', b: 2}     {a:1, b: 'jack'}2.2使用Object.assgin() 不适用于对象里面有数组的{a: 1, b: 2, arr: [1, 2, 3]}
对象:
var obj3 = {a: 1, b: 2}
var obj4 = Object.assign({}, obj3) // 把obj3复制一份与新对象合并一起
console.log(obj3, obj4)  // {a: 1, b: 2}     {a:1, b: 2}
obj3.a = 'hello'
obj4.b = 'jack'
console.log(obj1, obj2) // {a: 'hello', b: 2}     {a:1, b: 'jack'}数组:
arr1 = [1,2,3,4]
arr2 = Object.assign([], arr1)
console.log(arr1,arr2) // (4)[1, 2, 3, 4]       (4) [1, 2, 3, 4]
arr1[0] = 'hello'
arr2[1] = 'jack'
console.log(arr1, arr2)  // (4) ['hello', 2, 3, 4] (4) [1, 'jack', 3, 4]2.3使用es6解构    
不适用于对象里面有数组的{a: 1, b: 2, arr: [1, 2, 3]}
var obj5 = {a: 1, b: 2}
var obj6 = {...obj5}
obj5.a = 'hello'
obj6.b = 'jack'
console.log(obj5, obj6) // {a: 'hello', b: 2}     {a: 1, b: 'jack'}----------优化对象里有数组的----------
var obj5 = {a: 1, b: 2, arr: [1, 2, 3, 4]}
var obj6 = {...obj5, arr: obj5.arr.map(item => item)} // map返回新数组,相当于 arr: [xxx]不是赋值是开辟了新数组新地址
// console.log(obj5, obj6)
obj5.a = 'hello'
obj6.b = 'jack'
obj5.arr[0] = 'name'
obj6.arr[0] = 'rose'
console.log(obj5, obj6)  // {a: 'hello', b: 2, arr: ['name', 2, 3, 4]}     {a: 1, b: 'jack', arr: ['rose', 2, 3, 4]}2.4写个函数来复制(递归函数)
var obj5 = {a: 1, b: 2, arr: [1,2,3,4,5]}
function copyObj(obj){var newObj = {}for (var key in obj) {newObj[key] = obj[key]}return newObj
}
// 优化
function copyObj(obj){/* if (Array.isArray(obj)) {var newObj = [];} else {var newObj = {};}*/Array.isArray(obj) ? var newObj = [] : var newObj = {}for (var key in obj) {if (typeof obj[key] == 'object') {newObj[key] = copyObj(obj[key])} else {newObj[key] = obj[key]}}return newObj
}
var obj6 = copyObj(obj5)// obj6.arr = ['h','e', 'l']
console.log(obj5, obj6)  //  {a: 1, b: 2, arr: Array(5)} {a: 1, b: 2, arr: Array(5)}2.5数组深拷贝 array.concat(),array.slice(), Array.from(array),展开运算符  把括号内的数组内容追加到后面
var list = ['jack', 'rose'];
var listCopy = [].concat(list)
var listCopy = list.slice() // 使用slice不传参的话会返回一个新的数组,并且包含所有从头到尾的所有元素,即使改变也不会改变原数组
var listCopy = Array.from(list) // 不影响原数组
var listCopy = [...list] // 展开运算符不影响原数组
listCopy.push('海绵宝宝', '派大星')
console.log(list, listCopy) // (2) ['jack', 'rose']      (4) ['jack', 'rose', '海绵宝宝', '派大星']如果改为引用类型就是浅拷贝
var list = [{jack: 'rose'}]
var listCopy = [...list]
listCopy[0].jack = 'luxi'
console.log(list, listCopy) // [{jack: 'luxi'}]    [{jack: 'luxi'}]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】day03-VueCli(脚手架)

day03 一、今日目标 1.生命周期 生命周期介绍 生命周期的四个阶段 生命周期钩子 声明周期案例 2.综合案例-小黑记账清单 列表渲染 添加/删除 饼图渲染 3.工程化开发入门 工程化开发和脚手架 项目运行流程 组件化 组件注册 4.综合案例-小兔仙首页 拆分模块-局部…

SpringBoot 如何使用 MockMvc 进行 Web 集成测试

SpringBoot 如何使用 MockMvc 进行 Web 集成测试 介绍 SpringBoot 是一个流行的 Java Web 开发框架,它提供了一些强大的工具和库,使得开发 Web 应用程序变得更加容易。其中之一是 MockMvc,它提供了一种测试 SpringBoot Web 应用程序的方式&…

什么是神经网络?

我们常常使用深度学习来指训练神经网络的过程。 在这里举一个房屋价格预测的例子:假设有一个数据集,它包含了六栋房子的信息。所以,你知道房屋的面积是多少平方米,并且知道这个房屋的价格。这是,你想要拟合一个根据房屋…

el-form 初值和resetFields问题

配置片段。 给dataForm动态赋初值&#xff0c;必须如下&#xff0c;用 this.dataForm{}这种方式&#xff0c;其他的形式如 this.dataForm.属性、this.dataForm[属性] 都会失败且造成 el-form和resetFields 出现问题 <el-formref"dataForm":model"dataForm&qu…

【论文阅读】DQnet: Cross-Model Detail Querying for Camouflaged Object Detection

DQnet: Cross-Model Detail Querying for Camouflaged Object Detection DQnet&#xff1a;伪装目标检测中的跨模型细节查询 论文地址&#xff1a;https://arxiv.org/abs/2212.08296 这篇文章提出了一个交叉模型框架&#xff08;CNN-Transformer并行&#xff09;来检测伪装目…

【自启动配置】Ubuntu 设置开机自启动脚本

Ubuntu 开机运行的脚本和当前操作系统运行的级别有关&#xff0c;OS 的运行级别大概分为七个 目录 1、查看 OS 运行级别 2、创建自启动脚本 3、添加软链接 1、查看 OS 运行级别 输入命令 runlevel 查看当前系统运行级别。当前系统的运行级别为 5 2、创建自启动脚本 在 /et…

实训笔记7.19

实训笔记7.19 7.19一、座右铭二、Hadoop的HDFS分布式文件存储系统的相关原理性内容2.1 HDFS上传数据的流程2.2 HDFS下载数据的流程2.3 HDFS中NameNode和SecondaryNameNode工作机制&#xff08;涉及到HDFS的元数据管理操作&#xff09;2.4 HDFS中NameNode和DataNode的工作机制&a…

easyui tabs切换

easyui tabs切换之前提醒保存修改的信息 当存在多个tabs,相互切换时提醒保存修改的信息&#xff1a; 这里用的鼠标mousedown事件 var tabs $(#tabsId).tabs().tabs(tabs);for(var item0; item<tabs.length; item){tabs[item].panel(options).tab.unbind().bind(mousedow…

小程序自定义步骤条实现

效果展示&#xff1a; 支持背景颜色自定义 <view class"hl_steps"><view class"hl_steps_item" wx:for"{{steps}}" wx:key"id"><view class"hl_steps_item_circle_out" style"background-color: {{col…

【SpringCloud Alibaba】(二)微服务环境搭建

1. 项目流程搭建 整个项目主要分为 用户微服务、商品微服务和订单微服务&#xff0c;整个过程模拟的是用户下单扣减库存的操作。这里&#xff0c;为了简化整个流程&#xff0c;将商品的库存信息保存到了商品数据表&#xff0c;同时&#xff0c;使用商品微服务来扣减库存。小伙…

「苹果安卓」手机搜狗输入法怎么调整字体大小及键盘高度?

手机搜狗输入法怎么调整字体大小及键盘高度&#xff1f; 1、在手机上准备输入文字&#xff0c;调起使用的搜狗输入法手机键盘&#xff1b; 2、点击搜狗输入法键盘左侧的图标&#xff0c;进入更多功能管理&#xff1b; 3、在搜狗输入法更多功能管理内找到定制工具栏&#xff0c…

[数据结构 -- C语言] 二叉树(BinaryTree)

目录 1、树的概念及结构 1.1 树的概念 1.2 树的相关概念&#xff08;很重要&#xff09; 1.3 树的表示 2、二叉树的概念及结构 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质&#xff08;很重要&#xff09; 2.4 练习题 2.5 二叉树的存储结构 2.5.1 顺序存储 2.5.2 链…

Jenkins报警机制的配置与Linux的使用总结

先在钉钉中添加一个机器人 在Configure System中找到机器人选项&#xff0c;并且复制webhook到网络钩子&#xff0c;然后添加机器人的编号、名称和关键词&#xff0c;然后点击测试&#xff0c;如果显示测试成功则表示配置成功&#xff0c;最后保存 再到配置中勾选顶顶机器人的定…

【CMU15-445 FALL 2022】Project #1 - Buffer Pool

About 实验官网 Project #1 - Buffer Pool在线评测网站 gradescope Lab Task #1 - Extendible Hash Table 详见——【CMU15-445 FALL 2022】Project #1 - Extendable Hashing 如果链接失效&#xff0c;请查看当前平台我之前发布的文章。 Task #2 - LRU-K Replacement Polic…

YOLOv5基础知识

定位和检测: 定位是找到检测图像中带有一个给定标签的单个目标 检测是找到图像中带有给定标签的所有目标 图像分割和目标检测的区别&#xff1a; 图像分割即为检测出物体的完整轮廓&#xff0c;而目标检测则是检测出对应的目标。&#xff08;使用框框把物体框出来&#xff…

常见JVM参数配置和GC性能优化

常见的JVM参数配置 垃圾回收统计信息 -XX:PrintGC 打印GC简要信息 -XX:PrintGCDetails打印GC的详细信息 -XX:PrintGCTimeStamps打印CG发生的时间戳 -Xloggc:log/gc.log 指定GC log的位置&#xff0c;以文件输出 -XX:PrintHeapAtGC 每一次GC前和GC后&#xff0c;都打印堆信…

SAP客制化区域菜单和IMG配置清单

1. 自定义区域菜单 事务代码 SE43&#xff0c;操作如下 添加菜单对象 展示效果 输入区域菜单名称并回车&#xff0c;效果如下 2. 自定义IMG配置 事务代码 SIMGH IMG structure 示例-事务代码入口 示例-表格维护入口 示例-自定义代码控制对象 需要创建dummy表并设置表维护 页面设…

React、Vue框架如何实现组件更新,原理是什么?

引言 React 和 Vue 都是当今最流行的前端框架,它们都实现了组件化开发模式。为了优化性能,两者都采用了虚拟DOM技术。当组件状态发生改变时,它们会使用虚拟DOM进行局部渲染比对,只更新必要的DOM节点,从而避免重新渲染整个组件树。本文将从React和Vue的组件更新原理入手,剖析两…

Progressive Dual-Branch Network for Low-Light Image Enhancement 论文阅读笔记

这是22年中科院2区期刊的一篇有监督暗图增强的论文 网络结构如下图所示&#xff1a; ARM模块如下图所示&#xff1a; CAB模块如下图所示&#xff1a; LKA模块其实就是放进去了一些大卷积核&#xff1a; AFB模块如下图所示&#xff1a; 这些网络结构没什么特别的&#xf…

分布式光伏监控系统运维系统实时查看数据分布式光伏电站监控管理

光伏电站是一种利用太阳能发电的设施&#xff0c;随着人们对可再生能源的需求不断增加&#xff0c;光伏电站的建设也越来越普遍。但是&#xff0c;光伏电站的运营和管理需要高质量的监控系统来确保其正常运行。本文将介绍光伏电站监控系统的组成及其原理。 详细软件具体需求可…