基本类型值,是按值复制的,而不是按引用复制的。(深浅拷贝)

2024-06-09 08:12

本文主要是介绍基本类型值,是按值复制的,而不是按引用复制的。(深浅拷贝),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

let obj=[1,2,4]
let obj2=Array.from(obj)
obj2[0]=23
console.log(obj)

这是浅拷贝吗?

在给出的例子中,Array.from(obj) 实际上执行的是对数组 obj 的浅拷贝。这是因为数组在JavaScript中是一种特殊的对象,其元素存储在索引属性中。Array.from() 方法创建了一个新的数组实例,并将原数组 obj 的每个元素复制到新数组中。但是,由于数组元素本身(在这个例子中是数字)是基本类型值,它们是按值复制的,而不是按引用复制的。

因此,当您修改 obj2[0] 的值为 23 时,原数组 obj 并未受到影响,因为您没有修改任何对象的引用,只是修改了新数组 obj2 的第一个元素的值。

但是,如果数组 obj 包含的是对象引用(而不是基本类型值),那么 Array.from() 仍然会执行浅拷贝,这意味着新数组 obj2 中的对象引用将指向与原数组 obj 中相同的对象。对这些对象的修改将会影响两个数组。

在您的例子中,由于数组 obj 只包含基本类型值(数字),因此可以说 Array.from(obj) 创建了一个与 obj 完全独立的数组 obj2,对 obj2 的修改不会影响到 obj。但这并不改变 Array.from() 执行的是浅拷贝的事实,只是在这个特定的例子中,浅拷贝和深拷贝在行为上没有区别。


基本类型值,是按值复制的,而不是按引用复制的

在JavaScript中,基本类型值(如数字、字符串、布尔值、nullundefinedSymbol 以及ES10引入的BigInt)是按值复制的。这意味着当你将一个基本类型的值赋给一个新的变量时,你实际上是在内存中创建了这个值的一个全新副本,并将新变量的引用指向这个新副本。

对于对象(包括数组、函数、对象字面量等),它们是按引用复制的。但是,当使用 Array.from() 或其他类似的方法(如展开运算符 ... 或 slice())来“复制”数组时,虽然数组本身是按引用复制的(即新数组是一个新的数组对象),但数组中的元素(如果它们是对象)则取决于这些元素是基本类型还是对象类型。

  • 如果数组中的元素是基本类型,那么这些元素是按值复制的。
  • 如果数组中的元素是对象类型(包括其他数组、函数、对象字面量等),那么这些元素实际上是按引用复制的,即新数组中的这些元素引用的是和原数组中相同的对象。

由于数组 obj 只包含基本类型值(数字),因此使用 Array.from(obj) 创建的新数组 obj2 中的元素与原数组 obj 中的元素是完全独立的。对 obj2 中元素的任何修改都不会影响 obj 中的元素。

let obj=[1,2,4,{name:'张三',age:18}]
let obj2=Array.from(obj)
obj2[3].name='引用数据类型,按引用复制'
console.log(obj)
//输出[ 1, 2, 4, { name: '引用数据类型,按引用复制', age: 18 } ]

修改了复制的会影响原来的

这篇关于基本类型值,是按值复制的,而不是按引用复制的。(深浅拷贝)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1044640

相关文章

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎