javaScript 深浅拷贝

javaScript深浅拷贝

在这里插入图片描述

浅拷贝

自己创建一个新的对象,来接受你要重新复制或引用的对象值。如果对象属性是基本的数据类型,复制的就是基本类型的值给新对象,但如果属性是引用数据类型,复制的就是内存中的地址,如果其中一个对象改变了这个内存中的地址,肯定会影响到另一个对象。

object.assign

object.assign是ES6中object 的一个方法该方法可以用于 JS 对象的合并等多个用途其中一个用途就是可以进行浅拷贝

object.assign 的语法为:0bject.assign(target,..sources)
let target = {}
let source = {a: {b: 1}}
Object.assign(target,source)
console.log(target)
source.a.b = 10
console.log(source)
console.log(target)

输出:

{ a: { b: 1 } }
{ a: { b: 10 } }
{ a: { b: 10 } }

object.assign 特性

  • 它不会拷贝对象的继承属性
  • 它不会拷贝对象的不可枚举的属性
  • 可以拷贝 Symbol类型的属性
let obj1 = {a: {b: 1}, sym: Symbol(1)}
Object.defineProperty(obj1,"innumerable",{
    value:'不可枚举类型',
    enumerable: false
})

let obj2 = {}
Object.assign(obj2,obj1)
obj1.a.b = 2

console.log("obj1",obj1)
console.log("obj2",obj2)

在这里插入图片描述

扩展运算符 …

/*对象的拷贝 */
let obj = {a: 1, b: {c: 1}}
let obj2 = {...obj}
obj.a = 2
console.log(obj) //{a:2,b:{c:1}} console.log(obj2); //{a:1,b:{c:1}}
obj.b.c = 2
console.log(obj) //{a:2,b:{c:2}} console.log(obj2); //{a:1,b:{c:2}}
/*数组的拷贝 */
let arr = [1, 2, 3]
let newArr = [...arr];//跟arr.slice()是一样的效果

输出

{ a: 2, b: { c: 1 } }
{ a: 2, b: { c: 2 } }

concat 拷贝数组

数组的 concat 方法其实也是浅拷贝

let arr = [1, 2, 3];
let newArr = arr.concat();
newArr[1] = 100
console.log(arr); // [ 1, 2, 3 ]
console.log(newArr);//[1, 100, 3 ]
[ 1, 2, 3 ]  
[ 1, 100, 3 ]

slice 拷贝数组

slice 方法仅仅针对数组类型

slice 的语法为:arr.slice(begin,end);
let arr = [1, 2, {val: 4}];
let newArr = arr.slice();
newArr[2].val = 1000;
console.log(arr);//[1,2,{val: 1000 }]

输出

[ 1, 2, { val: 1000 } ]

浅拷贝示例

const shallowClone = (target) => {
    if (typeof target === 'object' && target !== null) {
        const cloneTarget = Array.isArray(target) ? [] : {};
        for (let prop in target) {
            if (target.hasOwnProperty(prop)) {
                cloneTarget[prop] = target[prop]
                return cloneTarget;
            } else {
                return target
            }
        }
    }
}

浅拷贝总结

浅拷贝只是创建了一个新的对象,复制了原有对象的基本类型的值
对于复杂引用数据类型其在堆内存中完全开辟了一块内存地址并将原有的对象完全复制过来存放

深拷贝

将一个对象从内存中完整地拷贝出来一份给目标对象并从堆内存中开辟一个全新的空间存放新对象,且新对象的修改并不会改变原对象,二者实现真正的分离。

JSON.stringfy

在这里插入图片描述

let obj1 = {a: 1, b: [1, 2, 3]}
let str = JSON.stringify(obj1);
let obj2 = JSON.parse(str);
console.log(obj2); //{a:1,b:[1,2,3]}
obj1.a = 2;
obj1.b.push(4);
console.log(obj1); //{a:2,b:[1,2,3,4]}
console.log(obj2); //{a:1,b:[1,2,3]}

输出:

{ a: 1, b: [ 1, 2, 3 ] }   
{ a: 2, b: [ 1, 2, 3, 4 ] }
{ a: 1, b: [ 1, 2, 3 ] } 

JSON.stringfy 拷贝注意点

1.拷贝的对象的值中如果有函数、undefined、symbol这几种类型,经过JSON.stringify序列化之后的字符串中这个键值对会消失
2.拷贝 Date 引用类型会变成字符串
3.无法拷贝不可枚举的属性
4.无法拷贝对象的原型链
5.拷贝 RegExp 引用类型会变成空对象
6.对象中含有 NaN、Infinity 以及 -Infinity,JSON 序列化的结果会变成 null
7.无法拷贝对象的循环应用,即对象成环(obj[key]=obj)

function Obj() {
    this.func = function () {
        alert(1)
    };
    this.obj = {a: 1};
    this.arr = [1, 2, 3];
    this.und = undefined;
    this.reg = /123/;
    this.date = new Date(0);
    this.NaN = NaN
    this.infinity = Infinity;
    this.sym = Symbol(1);
}

let obj1 = new Obj();
Object.defineProperty(obj1, 'innumerable', {
    enumerable: false,
    value: "innumerable"
})
console.log('obj1', obj1)
let str = JSON.stringify(obj1);
let obj2 = JSON.parse(str);
console.log('obj2', obj2)
obj1 Obj {                       
  func: [Function (anonymous)],  
  obj: { a: 1 },                 
  arr: [ 1, 2, 3 ],              
  und: undefined,                
  reg: /123/,                    
  date: 1970-01-01T00:00:00.000Z,
  NaN: NaN,                      
  infinity: Infinity,            
  sym: Symbol(1)
}
obj2 {
  obj: { a: 1 },
  arr: [ 1, 2, 3 ],
  reg: {},
  date: '1970-01-01T00:00:00.000Z',
  NaN: null,
  infinity: null
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pip降级在pycharm中

PyCharm依赖于"–build-dir"参数安装第三方库,但该参数在最新的23.0版pip中已删除 解决办法就是降级pip,PyCharm中选择File,找到编译器,点击pip,勾选对应版本即可 或者在cmd中执行运行python -m pip install…

swift 长按桌面图标弹出快捷选项

文章目录 一、3D Touch二、主屏交互1. 静态添加2. 动态添加三、监听主屏交互按钮的点击事件四、预览和跳转1. 注册3D touch2. 实现协议3. 在目标控制器复写previewActionItems4. 使用UIContextMenuConfiguration一、3D Touch 3D Touch通过屏幕下方的压力感应器来感知不同的压力…

蓝桥杯Java B组历年真题(2013年-2019年)

一、2013年真题 1、世纪末的星期 使用日期类判断就行,这里使用LocalDate,也可以使用Calendar类 答案 2099 使用LocalDate import java.time.LocalDate; import java.time.format.DateTimeFormatter; // 1:无需package // 2: 类名必须Main, 不可修改p…

【AIGC】微笑的秘密花园:红玫瑰与少女的美好相遇

在这个迷人的画面中,我们目睹了一个迷人的时刻,女子则拥有一头柔顺亮丽的秀发,明亮的眼睛如同星河般璀璨,优雅而灵动,她的微笑如春日暖阳,温暖而又迷人。站在红玫瑰花瓣的惊人洪水中。 在一片湛蓝无云的晴…

YOLOv9有效提点|加入BAM、CloFormer、Reversible Column Networks、Lskblock等几十种注意力机制(二)

专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,主力高效涨点!!! 一、本文介绍 本文只有代码及注意力模块简介,YOLOv9中的添加教程:可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

【机器学习300问】25、常见的模型评估指标有哪些?

模型除了从数据划分的角度来评估,我上一篇文章介绍了数据集划分的角度: 【机器学习300问】24、模型评估的常见方法有哪些?http://t.csdnimg.cn/LRyEt 还可以从一些指标的角度来评估,这篇文章就带大家从两个最经典的任务场景介绍…

天津公租房租金怎么算?附计算方式

天津公共租赁住房租金如何计算?附计算方法 天津市公共租赁住房租金租金标准建筑面积(100分-减分)。 公共租赁住房租金按照建筑面积计算。 应收租金以人民币计算,低于人民币的部分四舍五入。 具体内容见正文。 申请天津公共租赁住…

Go 与 Rust:导航编程语言景观

在当今构建软件时,开发者在编程语言上有着丰富的选择。两种脱颖而出的语言是 Go 和 Rust - 都很强大但却截然不同。本文将从各种因素比较这两种语言,以帮助您确定哪种更适合您的需求。 我们将权衡它们在并发、安全性、速度、互操作性等方面的方法。我们将…

软件系统开发流程规范

目的:规范系统开发流程,提高系统开发效率。 立项申请需求分析方案设计方案评审开发调整测试阶段系统培训试运行测试验收投入使用 所有文档过去进主页获取。

基于 STM32U5 片内温度传感器正确测算温度

目录预览 1、引言 2、问题 3、小结 01 引言 STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控晶圆上的温度还是挺好的,以防止芯片过温运行。 02 问题…

MATLAB知识点:利用智能缩进整理代码

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自​第4章:MATLAB程序流程控制 小技巧&#x…

LZO索引文件失效说明

在hive中创建lzo文件和索引时,进行查询时会出现问题.hive的默认输入格式是开启小文件合并的,会把索引也合并进来。所以要关闭hive小文件合并功能!

GIT概述及安装

文章目录 01.GIT概述内容小结 02.GIT相关概念(掌握)目标内容小结 03.GIT下载与安装目标内容 01.GIT概述 内容 Git是目前世界上最先进的分布式文件版本控制系统(没有之一) 版本控制 所谓的版本控制就是将一组文件的改动记录下来,形成版本历史…

2024年新提出的算法|LEA爱情进化算法(Love Evolution Algorithm)

Love Evolution Algorithm: a stimulus–value–role theory-inspired evolutionary algorithm for global optimization 爱情进化算法Love Evolution Algorithm,LEA,于2024年2月发表在中科院3区SCI期刊 The Journal of Supercomputing。 1、简介 本文提…

新 Logo 正式发布,Tubi 品牌全面升级!

作为新一代观众的首选流媒体平台,Tubi 持续扩大自身影响力,并于近日推出了富有活力的新品牌形象。 根据 Nielsen 的 The Gauge 报告,Tubi 在 2024 年 1 月的电视总观看份额提升至 1.5%,在年轻人和多元化观众群体中的吸引力持续上升…

SpringCloud(18)之Sleuth +Zipkin链路追踪

一、Zipkin介绍 Zipkin是一个开放源代码分布式的跟踪系统,它可以帮助收集服务的时间数据,以解决微服务架构中的延迟问 题,包括数据的收集、存储、查找和展现。每个服务向zipkin报告计时数据,zipkin会根据调用关系通 过Zipkin UI…

安泰ATA-M4功率放大器在变压器老化中的应用研究

变压器是电力系统中不可或缺的元件,用于升降电压,以实现电能的传输和分配。然而,变压器在长期运行中会受到各种环境和电力因素的影响,导致老化和损耗。变压器老化问题对电力系统的可靠性和稳定性构成威胁。因此,为了确…

机器学习笔记 YOLOv9模型相关论文简读

一、YOLOv9简述 自 2015 年 Yolov1 推出以来,已经出现了多个版本。 基于Darknet的YOLOv2、YOLOv3和YOLOv4 YOLOv5 YOLOv8 基于 Ultralytics。 SCALED-YOLOv4 使用 Pytorch 而不是 Darknet。 YOLOR是YOLOv4的改进。 YOLOX是YOLOv3的改进。 YOLOv6专注于工业应用。 YOLOv7 来自 …

在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录

在线上传解压PHP文件代码,压缩/压缩(网站一键打包)支持密码登录 资源宝分享:www.httple.net 如果你没有主机控制面板这个是最好选择,不需要数据库,上传当控制面板使用,无需安装任何扩展,安全高,…

【Linux深入剖析】进程控制 | 进程程序替换--长篇深层次讨论

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.进程创建1.1 fork函…