深拷贝和浅拷贝-M

news2024/11/20 9:41:16

深拷贝和浅拷贝

数据类型分为:基本数据类型和引用类型

首先基本数据类型分为:number,string,boolean,null,undefined,symbol以及未来ES10新增的BigInt(任意精度整数)七类。
引用类型分为Array,Object,Function,正则等。

两种数据类型怎么进行存储数据的

基本数据类型

对应基本数据类型来说,名和值都是存储在栈内存中。例如let a = 1,那么名a和值b都是存储在栈内存中,如果b=a,将a复制给b时,栈内存会新开辟一个内存,这样a与b互不影响,当a的值发生改变时,不会影响到b。基本数据类型不存在深拷贝还是浅拷贝这一说法,此说法只存在于引用型数据。
在这里插入图片描述

引用类型

引用数据类型,名是存储在栈内存中,值是存储在堆内存里面,但是栈内存会提供一个引用的地址指向堆内存中的值。当b=a,将a复制给b时,其实复制的是a的引用地址,而并不是堆里面的值。当改变a的值的时候,由于a和b指向的是同一个地址,那么b自然会受到影响,这就是浅拷贝。那么要是在堆内存中也开辟一个新的内存专门为b存放值,那么就能达到深拷贝的效果了。
在这里插入图片描述

怎么实现深拷贝的

1、通过递归方式实现深拷贝

遍历对象、数组,直到里边都是基本数据类型,然后再去复制,就是深度拷贝。

function deepClone(obj) {
    var target = {};
    for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            if (typeof obj[key] === 'object') {
                target[key] = deepClone(obj[key]);
            } else {
                target[key] = obj[key];
            }
        }
    }
    return target;
}

2、JSON.parse(JSON.stringify(obj))

用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。只能实现数组或对象深拷贝,但不能处理函数。

let obj = {
    id: 1,
    name: '张三',
    age: 10,
}
let newObj = JSON.parse(JSON.stringify(obj))

3、jQuery的extend方法实现深拷贝

var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝

怎么实现浅拷贝

1、Object.assign()

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

Object.assign(target, ...sources)
arget--->目标对象
source--->源对象
返回值:target,即目标对象

只有一级属性为深拷贝,二级属性后就是浅拷贝
浅拷贝:

//如果只是想将两个或多个对象的属性合并到一起,不改变原有对象的属性,可以用一个空的对象作为target对象。
var target={name:'guxin',age:25};
var source={state:'single'}
var result=Object.assign({},target,source);
console.log(result)//{name: 'guxin', age: 25, state: 'single'}

深拷贝:

var obj = { a: {a: "kobe", b: 39} };
var initalObj = Object.assign({}, obj);
initalObj.a.a = "wade";
console.log(obj.a.a); 

source上的state属性可以合并到target对象上(如果有同名属性的话,后面的属性值会覆盖前面的属性值):

var target={name:'guxin',age:25};
var source={state:'single'}
var result=Object.assign(target,source);
console.log(target,target==result);//{name: 'guxin', age: 25, state: 'single'} true

2、扩展运算符

只有一级属性为深拷贝,二级属性后就是浅拷贝
深拷贝:

var obj = {a: 1,b: 2}
var obj1 = {…obj} //深拷贝

3、数组使用数组方法(concat、slice)

只有一级属性为深拷贝,二级属性后就是浅拷贝
深拷贝:

var arr1 = [1, 2, 3, 4]
var arr2 = arr1.concat()
var arr3 = arr1.slice(1)

浅拷贝:

let arr = [1, 3, {username: 'kobe' }];
let arr2=arr.concat();    
arr2[2].username = 'wade';
console.log(arr);
let arr = [1, 3, {username: 'kobe' }];
let arr3 = arr.slice();
arr3[2].username = 'wade'
console.log(arr);

Array的slice和concat方法不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。如:

let arr = [1, 3, {    username: ' kobe'    }];
let arr3 = arr.slice();
arr3[1] = 2
console.log(arr,arr3);

在这里插入图片描述

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

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

相关文章

Charles 流量配置(弱网测试)、断点调试

一、流量配置 流量配置主要是用来检测软件(APP)在不同的网络环境下的一个表现,例如出现丢包闪退等情况. 流量配置主要有以下四步: 在 Charles 窗口中点击菜单 “Proxy” ,选择 "Throttle Setting" 进行网络…

ChatGPT副业赚钱·Midjourney之logo设计《猪八戒网站接单制作Logo》- 第10篇

历史文章 文心一言 PK ChatGPT,二者究竟谁更胜一筹 - 第7篇 用Midjourney画个美女,AI绘画也太强大了!!! - 第8篇 推荐一款idea神级代码插件【Bito-ChatGPT】而且免费!- 第9篇 ​ 悟纤:师傅&a…

合理利用Optional 来避免NPE

一、什么是Optional 在Java中什么异常最容易出现,那肯定是NullPointerException,空指针就像一个定时炸弹,总给我们带来些麻烦,在开发过程中都会碰到需要判断Null值以防止空指针的情况,以往的方式要么是抛异常&#xf…

(3)---STM32通信

目录 【1】通信的基础知识 【2】USART 【3】串口通信协议 【4】相关寄存器 串口控制寄存器 波特率寄存器 中断和状态寄存器 数据发送寄存器 数据接收寄存器 【5】 USART功能框图 【6】串口发送实验 实验要求 1.观察实物 2.分析原理图 3.STM32CubeMX配置 4、寄存器方式编写…

选择性搜索算法(Selective Search )——SS算法

文章目录 一、前言二、object Detection VS object Recognition(Selective Search的提出)2.1object recognition与object detection的关系2.2滑动窗口方法的局限性2.3Selective search算法的提出 三、Selective Search算法3.1什么是Selective Search&…

ChatGPT工作提效之遇强则强

ChatGPT工作提效之遇强则强 前言一、如何使用ChatGPT二、ChatGPT实战应用三、ChatGPT会叫的小孩有奶吃工具类的交互问答类的交互开发类的交互 前言 读《笑傲江湖》西湖比剑时,对于独孤九剑1的解读印象颇为深刻。令狐冲被任我行这个高手激发出许多精妙的剑招。这独孤…

消息队列-RabbitMQ

文章目录 1.什么是MQ1.1 特点1.2 MQ产品分类 2.RabbitMQ2.1.RabbitMQ介绍2.2.使用Docker安装RabbitMQ 3.SpringBoot中使用RabbitMQ3.1.SpringAMQP3.2使用步骤 1.什么是MQ RabbitMQ官方文档 消息队列(Message Queue,简称MQ):是在消息的传输过程中保存消…

Learning C++ No.22【二叉树OJ题实战】

文章目录 引言:第一题:根据二叉树创建字符串第二题:二叉树的层序遍历第三题:自底向上实现层序遍历第四题:二叉树的最近公共祖先第五题:将搜索二叉树转换成双向链表第六题:从前序和中序遍历序列构…

修改USRPx410的ip地址

用 .\uhd_find_devices.exe查询设备 打印信息解释如下 在C:\Program Files\UHD\bin下打开powershell,输入如下指令ssh root@192.168.10.2 进入到设备内部 输入ifconfig,获取每个口的地址 输入ifconfig sfp0 192.168.10.3进行修改 重新.\uhd_find_devices.exe查询设备。 …

Linux:软件安装方法与命令yum.扩展ubantu系统的软件安装方法与命令apt

Linux:软件安装方法与命令yum: 这里的search可以想象成在linux的应用商店内搜索 例: 通过yum安装wget这个软件。 search搜索wget: 发现在“linux的应用市场”内有wget这个软件,现在再用yum -y install wget安装(上面已…

你好:Zookeeper

Zookeeper 初识 初识ZookeeperZookeeper 安装Zookeeper 命令操作Zookeeper数据模型服务端命令客户端命令JavaAPI操作Curator常用操作:前置环境连接Zookeeper集群创建节点查询节点修改节点删除节点事件监听机制 – Watch分布式锁实现分布式锁得API 初识Zookeeper Zo…

排序篇:外排序(排序文件中的数据)

目录 前言: 一:大体思路 二:分割成有序的小文件 (1)先给代码 (2)解析 三:进行文件归并 (1)主逻辑 (2)归并两个有序文件 四:全部代码 前言: 如果要排序的数据量非常大,内存无法容纳&…

零基础自学软件测试我只用了105天,从月薪3000到15K, 我整理的超全学习指南!

我21年毕业于管理类专业,干了大半年行政打杂,工作平淡无快感。性格较内向,思维严谨独立。喜欢软件测试工作内容的系统性,技术性,丰富性。以上便是转行的最初心理,大家觉得可妥?说干就干去年6月底…

(前期准备工作2)白嫖Replit的免费云服务器搭建属于自己的应用

Replit介绍 Replit(原来是https://repl.it)是一个基于浏览器的云端协同开发平台,可用于构建开发环境、实时协作、托管网络应用等。Replit提供可创建动态或者静态网站的容器,并会自动生成免费https域名(格式为:项目名.用户名.http://repl.co)。这代表着任何人都可以试用…

Kafka的工作原理

一、Kafka是什么? Kafka是一个分布式的基于发布/订阅模式的消息队列。分布式消息队列可以看成是将这种先进先出的数据结构独立部署在服务器上,应用程序可以通过远程访问接口使用它。 二、Kafka的工作机制是什么? 1.基本概念 2.消息模型 发…

WiFi基础学习到实战(六:Beacon帧字段解析)

欢迎大家一起学习探讨通信之WLAN。上节我们基于Android设备分析了WiFi扫描的代码实现,具体执行WiFi网络扫描由WiFi模块实现。WLAN协议定义扫描方式有“被动扫描”和“主动扫描”。本节继续分析“被动扫描”依赖Beacon帧中的字段。 好。我们先来看Android11 WiFi扫描…

会计转行数据分析,可行性多高?

看到这样的问题,第一个想法是想劝退,毕竟通过不明真相的网友身上找自己的未来,这件事听着就不靠谱。转行难,转行做好更好,虽然会计也与数据有关,但是数据分析涉及的技术内容明显有很大的差别。所以&#xf…

重塑职业未来:在竞争激烈的职场上脱颖而出的关键策略

在竞争激烈的职场上,各种职场难题时常出现,如何进行有效沟通、如何应对工作压力、如何提升职业能力等,这都是需要去克服的问题。下面分享一下职场老人的经验! 一、你遇到过哪些职场问题?分享一下你是怎么解决的呢&…

Type-C边充电边OTG转接器方案

随着生活水平的提高,大家的电子设备也多了起来,更有甚者会凑齐“全家桶”,手机,平板,笔记本电脑,智能手表,无线耳机,Switch,PS5,一样不落。那么多的电子设备&…

hibernate入门项目(一)

本节我们将演示如何搭建一个 Hibernate 工程。 搭建 Hibernate 工程需要以下 7 步: 下载 Hibernate 开发包 新建工程 创建数据库表 创建实体类 创建映射文件 创建 Hibernate 核心配置文件 测试 1. 下载 Hibernate 开发包 浏览器访问 Hibernate 官网 下载 Hibern…