数组和对象的拷贝(复制)

news2024/9/21 11:10:59

复制必须要产生新的对象。以下代码不是复制。

const arr = ["孙悟空", "猪八戒", "沙和尚"]

const arr2 = arr  // 不是复制,只是将arr的值赋给arr2,他们指的还是一个对象

console.log(arr)    // 二者输出一样
console.log(arr2)

代码在内存中的表现:

如何判断是不是复制了一个对象:看复制以后修改新对象的值,旧对象是否发生变化,不变则是复制,改变则不是复制(因为两个对象都指向同一个对象)

console.log(arr === arr2)
// true  =》 不是复制
// false =》 是复制

浅拷贝(shallow copy)

通常对对象的拷贝都是浅拷贝。浅拷贝顾名思义,只对对象的浅层进行复制(只复制一层)。如果对象中存储的数据是原始值,那么拷贝的深浅是不重要。浅拷贝只会对对象本身进行复制,不会复制对象中的属性(或元素)。

浅拷贝在内存中的表现:

对象不一样,但是里面的元素是一样的

 

浅拷贝方法

数组浅拷贝方法一:.slice()

不需要任何参数。当调用slice时,会产生一个新的数组对象,从而完成对数组的复制

const arr = ["孙悟空", "猪八戒", "沙和尚"]


const arr3 = arr.slice()

console.log(arr === arr3)   // false


arr3[0] = "唐僧"

console.log(arr)   // ["孙悟空", "猪八戒", "沙和尚"]

console.log(arr3)  // ["唐僧", "猪八戒", "沙和尚"]

 复制在内存中的表现:

数组浅拷贝方法二:...展开运算符

可以将一个数组中的元素展开到另一个数组中或者作为函数的参数传递,表示将数组中的元素放到新数组中

const arr = ["孙悟空", "猪八戒", "沙和尚"]

const arr3 = [...arr]   //  等同于const arr3 = [arr[0], arr[1], arr[2]]

const arr3 = ["唐僧", ...arr, "白骨精"]
console.log(arr)   // ["孙悟空", "猪八戒", "沙和尚"]
console.log(arr3)  // ["唐僧", "孙悟空", "猪八戒", "沙和尚", "白骨精"]

<补充>...用法

function sum(a, b, c) {
    return a + b + c
}

const arr4 = [10, 20, 30]

let result = sum(...arr4)  // 等同于let result = sum(arr4[0], arr4[1], arr4[2])

console.log(result)  // 60

对象浅拷贝方法一:Object.assign(目标对象, 被复制的对象)

将被复制对象中的属性复制到目标对象里,并将目标对象返回

const obj = { name: "孙悟空", age: 18 }

const obj2 = Object.assign({}, obj)

console.log(obj2)   //  { name: "孙悟空", age: 18 }

第一个参数的属性值会被第二个参数的覆盖:

const obj = { name: "孙悟空", age: 18 }

const obj2 = Object.assign({}, obj)

const obj2 = { address: "花果山"}  // obj2新增属性
console.log(obj2)  //  { name: "孙悟空", age: 18, address: "花果山" }


const obj2 = { address: "花果山", age: 28 }
Object.assign(obj2, obj)
console.log(obj2)   //  { name: "孙悟空", age: 18, address: "花果山" }

对象浅拷贝方法二:...展开运算符

const obj = { name: "孙悟空", age: 18 }

const obj3 = { address: "高老庄", ...obj, age: 48 } // obj3在后,obj3数据覆盖obj4的数据
console.log(obj3)   // { name: "孙悟空", age: 48, address: "高老庄" }


const obj3 = { address: "高老庄", age: 48, ...obj } // obj在后,obj数据覆盖obj3的数据
console.log(obj3)   // { name: "孙悟空", age: 18, address: "高老庄" }

深拷贝(deep copy)

深拷贝指不仅复制对象本身,还复制对象中的属性和元素。因为性能问题,通常情况不太使用深拷贝。

深拷贝在内存中的表现:

深拷贝方法

方法一:structuredClone()    浏览器提供

const arr = [{name:"孙悟空"}, {name:"猪八戒"}]

const arr3 = structuredClone(arr) // 浏览器提供的专门用来深拷贝的方法

console.log(arr)
console.log(arr3)

手动实现深拷贝和浅拷贝

见=》

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

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

相关文章

数楼梯(加强版)

数楼梯(加强版) 题目背景: 小明一天放学回家,看到从1楼到2楼共有n个台阶,因为好奇,他想尝试一下总共有几种方案到二楼?他可以1步,2步,3步的跳,不能跳3步以上. 他试了很多次都没有解决这个问题,于是请求聪明的你帮忙解决这个问题. 题目描述: 1楼到2楼楼梯有n级台阶。小明每…

Learning C++ No.8【内存管理】

引言&#xff1a; 北京时间&#xff1a;2023/2/12/18:04&#xff0c;昨天下午到达学校&#xff0c;摆烂到现在&#xff0c;该睡睡&#xff0c;该吃吃&#xff0c;该玩玩&#xff0c;在一顿操作之下&#xff0c;目前作息调整好了一些&#xff0c;在此记录&#xff0c;2月11&…

C++基础(6) - 复合类型(下)

文章目录指针1、指针概述1.1 存储器和存储地址空间1.2 内存地址1.3 指针和指针变量2、声明和初始化指针变量2.1 指针变量的声明2.2 指针变量的初始化3、使用指针变量3.1 解除引用3.2 野指针和空指针4、指针的宽度和跨度4.1 自身类型和指向类型4.2 指针变量所取内容的宽度4.3 指…

chatGPT会是银弹吗

chatGP最近火的一塌糊涂&#xff0c;它通过语言生成技术和自然语言处理能力&#xff0c;帮助用户快速解决问题并生成内容。目前&#xff0c;这款工具现在已经拥有超过一亿的活跃用户&#xff0c;并且因其高效率和易用性而受到了广大用户的好评。 不过谷歌可就倒霉了&#xff0c…

Shells:一款功能强大的反向Shell快速生成工具

关于Shells Shells是一款功能强大的反向Shell快速生成工具&#xff0c;该工具由4ndr34z负责开发和维护&#xff0c;可以帮助广大研究人员轻松生成常用的反向Shell。如果你需要一种简单的方法来生成格式化的PowerShell以及Python反向Shell的话&#xff0c;Shells这款工具将是你…

【IPD】敏捷开发与IPD结合的实践培训课程「3月11-12日」

课程名称敏捷开发与 IPD结合的实践 (Agile Development - IPD and Agile Development Practice &#xff09;参加对象企业总工、技术总监、系统架构师、研发经理、测试经理、质量/品质经理、研发测试骨干&#xff0c;以及研发测试技术人员。课程背景软件系统的日益复杂化和用户…

C语言学习笔记-内存管理

这篇将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 序号函数和描述1void calloc(int num, int size);在内存中动态地分配 num 个长度为 size 的连续空间&#xff0c;并将每一个字节都初始化为 0。所以…

2023的金三银四,测试员还能找到好工作吗?

按照往年的惯例&#xff0c;春节后复工的 3 月、4 月是人员跳槽最频繁的时候&#xff0c;俗称“金三银四”。然而&#xff0c;市场大环境的影响&#xff0c;很多行业感受到了一丝寒冷的气息。 我们以为受影响比较轻的互联网行业&#xff0c;头上也充满乌云&#xff0c;所谓互联…

ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3

书中程序适用于turtlebot、husky等多种机器人&#xff0c;配置相似都可以用的。支持ROS2版本foxy、humble。基础检测效果如下&#xff1a;由于缺&#xffe5;&#xff0c;所有设备都非常老旧&#xff0c;都是其他实验室淘汰或者拼凑出来的设备。机器人控制笔记本是2010年版本。…

九龙证券|本周5只新股申购,特斯拉、蔚来、理想的供应商来A股了!

据现在组织&#xff0c;2月13日到17日共有5只新股申购&#xff0c;其间上证主板2只&#xff0c;深证主板1只&#xff0c;北交所2只。 2月14日发动打新的深证主板新股多利科技成立于2010年&#xff0c;是一家专心于轿车冲压零部件及相关模具的开发、出产与出售的企业。从2020年…

nodejs版本管理器nvm下载,安装详情

文章目录前言一、NVM下载二、NVM安装三.使用NVM安装nodejs1.NVM常用命令2.安装node3.使用node前言 安装nodejs方式有两种。 第一种&#xff1a;官网下载  通过nodejs官网https://nodejs.org/zh-cn/下载安装 &#xff0c;但有个缺陷&#xff0c;不同版本的nodejs无法顺利的切…

软件测试面试理论(超详细)

【面试理论知识】1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己…

Dubbo中应用级,与接口级配置中心的使用,包括单配置中心与多配置中心

接口级或应用级服务发现 Dubbo3 默认采用 “应用级服务发现 接口级服务发现” 的双注册模式 可以通过配置 dubbo.registry.register-modeinstance/interface/all 来改变注册行为。 instance &#xff1a; 应用级interface &#xff1a; 接口级all &#xff1a;两者都注册&a…

一文详解jvm之-Xms -Xmx -Xmn -Xss -XX:PermSize -XX:MaxPermSize等参数的设置和优化以及如何选择垃圾回收器

文章目录1. 文章引言2. 常见配置汇总2.1 Xmn Xms Xmx Xss的区别2.2 其他常见配置2.3 典型设置举例3. 回收器选择3.1 吞吐量优先的并行收集器3.2 响应时间优先的并发收集器3.3 辅助信息4. 参考文档1. 文章引言 我们经常在tomcat的catalina.bat或者catalina.sh中配置如下参数&am…

亚马逊、速卖通、temu、Cdiscount通过自养号给自己店铺测评补单需要哪些技巧?

亚马逊卖家通过测评平台&#xff0c;获取亚马逊买家的真实服务点评&#xff0c;即亚马逊测评。它既可以让买家更加快速、有效地了解产品&#xff0c;也可以让卖家有机会通过买家的评论去优化产品&#xff0c;以获得更多买家的喜爱。因此&#xff0c;亚马逊测评之于卖家&#xf…

Linux下内存buff/cache占用过多问题解决

在Linux下经常会遇到buff/cache内存占用过多问题&#xff0c; 尤其是使用云主机的时候最严重&#xff0c;由于很多是虚拟内存&#xff0c;因此如果buff/cache占用过大的&#xff0c; free空闲内存就很少&#xff0c;影响使用&#xff1b; 通常内存关系是&#xff1a; 普通机器…

Python 获得摄像头捕捉的图像

Python 获得摄像头捕捉的图像 很多时候&#xff0c;我们都需要通过摄像头捕获图像&#xff0c;以便进行处理&#xff0c;在这里分享的是通过OPEN CV这个库来实现。 OPEN CV的安装和使用 安装很简单&#xff0c;相关文章也很多&#xff0c;注意一点&#xff0c;不要安装最新版…

【Android视频号信息获取①】

*在2019年深圳上班的时候 那时候还是个Java 码农 接触了一下 Xposed.时隔多年 忘记差不多了 用frida先来练练手 新公司又让我研究微信视频号获取个人的视频主页标题列表 * 确定微信版本 不同版本微信hook点不一样。 预想实现方式 用Xposed去请求注册一个中转服务 然后脚本请…

Java——编辑距离

题目链接 leetcode在线oj题——编辑距离 题目描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 题目示例 输入&#xff1a;word…

搭建DJI 无人机Onboard SDK ROS开发环境及测试

搭建DJI 无人机Onboard SDK ROS开发环境及测试功能包简介开发环境搭建测试功能包连接设备启动SDK功能包简介 ROS功能包名称&#xff1a;dji_sdk 功能包功能&#xff1a;用于DJI 板载SDK的ROS版本 OSDK 是一个用于开发无人机应用程序的开发工具包&#xff0c;基于OSDK 开发的…