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

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

相关文章

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li