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

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

相关文章

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou