javaScript 深浅拷贝

news2024/9/20 20:20:29

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
}

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

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

相关文章

1907_Arm Cortex-M3的基本了解

1907_Arm Cortex-M3的基本了解 全部学习汇总: g_arm_cores: ARM内核的学习笔记 (gitee.com) 我发现Arm Coretex-M3有一个专门的DataSheet,看起来这个的确是被当做了一个设计的产品来对待的。正好,基于这个文件来看看M3具备哪些基本的特性&…

http状态,cookie、session、token的对比

http是无状态的,也就是说断开会话了服务器就不记得任何事情了,但这样对于用户会很麻烦,因为要不停输入用户名和密码 cookie是放在浏览器里的数据,第一次访问后服务器会set cookie,然后浏览器保存这个cookie&#xff0…

Java基于微信小程序的房屋租赁、租房小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

计算机网络_2.1 物理层概述

2.1 物理层概述 一、物理层要实现的功能二、物理层接口特性 B站 深入浅出计算机网络 2.1物理层概述 一、物理层要实现的功能 物理层要实现的功能就是在各种传输媒体上传输比特0和1,进而给上面的数据链路层提供透明传输比特流的服务。 数据链路层“看不见”&#xff…

cpp基础学习笔记03:类型转换

static_cast 静态转换 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。用于基本数据类型之间的转换&#xff…

微服务day02-Ribbon负载均衡与Nacos安装与入门

一.Ribbon负载均衡 在上一节中,我们通过在RestTemplte实例中加上了注解 LoadBalanced,表示将来由RestTemplate发起的请求会被Ribbon拦截和处理,实现了访问服务时的负载均衡,那么他是如何实现的呢? 1.1 Ribbon负载均衡的原理 Rib…

(定时器/计数器)中断系统(详解与使用)

讲解 简介 定时器/计数器 定时器实际上也是计数器,只是计数的是固定周期的脉冲 定时和计数只是触发来源不同(时钟信号和外部脉冲)其他方面是一样的。 定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值…

[pdf]《软件方法》2024版部分公开-共196页

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 潘加宇《软件方法》2024版部分公开pdf文件,共196页,已上传CSDN资源。 也可到以下地址下载: http://www.umlchina.com/url/softmeth2024.html 如果…

韦东山嵌入式Liunx入门驱动开发四

文章目录 一、异常与中断的概念及处理流程1-1 中断的引入1-2 栈(1) CPU实现a ab的过程(2) 进程与线程 1-3 Linux系统对中断处理的演进1-4 Linux 中断系统中的重要数据结构(1) irq_desc 结构体(2) irqaction 结构体(3) irq_data 结构体(4) irq_domain 结构体(5) irq_domain 结构…

T3SF:一款功能全面的桌面端技术练习模拟框架

关于T3SF T3SF是一款功能全面的桌面端技术练习模拟框架,该工具针对基于主场景事件列表的各种事件提供了模块化的架构,并包含了针对每一个练习定义的规则集,以及允许为对应平台参数定义参数的配置文件。 该工具的主模块能够执行与其他特定模…

BetterDisplay Pro for Mac v2.0.11激活版:屏幕显示优化专家

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件,可以帮助用户调整显示器的颜色和亮度,以获得更加真实、清晰和舒适的视觉体验。 软件下载:BetterDisplay Pro for Mac v2.0.11激活版下载 🔍 精准校准&#xf…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号:股票技术分析的工具系列(3) 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍: DMI (趋向指标) 用法 1.PDI线从下向上突破MDI线,显示有新多头进场,为…

vscode+remote突然无法连接服务器以及ssh连接出问题时的排错方法

文章目录 设备描述状况描述解决方法当ssh连接出问题时的排错方法 设备描述 主机:win11,使用vscode的remote-ssh插件 服务器:阿里云的2C2GUbuntu 22.04 UFIE 状况描述 之前一直使用的是vscode的remote服务,都是能够正常连接服务…

LabVIEW流量控制系统

LabVIEW流量控制系统 为响应水下航行体操纵舵翼环量控制技术的试验研究需求,通过LabVIEW开发了一套小量程流量控制系统。该系统能够满足特定流量控制范围及精度要求,展现了其在实验研究中的经济性、可靠性和实用性,具有良好的推广价值。 项…

在学习云原生的时候,一直会报错ImagePullBackOff Back-off pulling image

在学习云原生的时候,一直会报错 (见最后几张图) ImagePullBackOff Back-off pulling image 然后我就在像。这个配置的镜像是不是可以自己直接下载,但是好像不怎么搜索得到 然后就在想,这个lfy_k8s_images到底是个啥玩…

TikTok矩阵系统功能怎么写?常用源代码是什么?

TikTok矩阵系统的功能是如何编写的?又有哪些常用的源代码支撑这些功能呢?本文将通过五段源代码的分享,为大家揭开TikTok矩阵系统的神秘面纱。 一、TikTok矩阵系统的核心功能 TikTok的矩阵系统涵盖了多个核心功能,包括但不限于用户管理、内容分发、推…

飞腾平台编译安装openGauss数据库

1. 环境检查 1.1 检查OS版本 openGauss支持的操作系统: CentOS 7.6(x86_64 架构)openEuler-20.03-LTS(aarch64 架构)openEuler-20.03-LTS(x86_64架构)Kylin-V10(aarch64 架构&…

mysql-Synch-clickhouse

Synch GitHub - long2ice/synch: Sync data from the other DB to ClickHouse(cluster) 环境: mysql5.7 redis > 5.0 clickhouse21.2 postgresql python3 binlog_formatrow XREAD default pg_config synch 1:安装clickhouse rpm下载地址&…

map和set例题应用

个人主页:Lei宝啊 愿所有美好如期而遇 目录 第一题 第二题 第三题 第一题 随机链表的复制https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 思路 首先遍历旧链表,并创建新节点,同时用map将旧节点与新节点…

ICASSP2024 | ICMC-ASR 车载多通道语音识别挑战赛总结

为促进驾驶场景中语音处理和识别研究,在ISCSLP 2022上成功举办智能驾驶座舱语音识别挑战 (ICSRC)的基础上,西工大音频语音与语言处理研究组 (ASLPNPU)联合理想汽车、希尔贝壳、WeNet社区、字节、微软、天津大学、南洋理工大学以及中国信息通信研究院等多…