首页 > 其他分享 >基本类型值,是按值复制的,而不是按引用复制的。(深浅拷贝)

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

时间:2024-06-09 09:02:42浏览次数:21  
标签:obj2 obj 按值 复制 引用 数组 拷贝 Array

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 } ]

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

标签:obj2,obj,按值,复制,引用,数组,拷贝,Array
From: https://blog.csdn.net/kjl536566/article/details/139548298

相关文章

  • Redis中的主从复制
    分布式系统中的几种Redis部署方式为了解决一个程序只部署在一个服务器上的单点问题:可用性问题,如果这个机器挂了,就意味着服务就中断了一个程序只部署在一台机器上,它的性能/支持的并发量也是有限的所以,就引入了分布式系统。在分布式系统中,往往希望有多个服务器来部署Redis......
  • 【Redis】Redis主从复制(一)————主从搭建
    目录背景主从复制主从复制的工作流程主从复制的优点配置redis主从结构复制配置文件,修改配置主从结构启动redis服务备注查看复制状态背景单节点服务器的问题问题:可用性:如果这个机器挂了,意味着服务就中断了.性能:支持的并发量也是比较有限的.解决思路:引入分布......
  • Mysql 8.4.0 结合 Docker 搭建GTID主从复制,以及传统主从复制
    注意:本教程不适用旧版本,Mysql8.4.0和旧版本,主从复制相关命令有所变化,具体区别请看文末参考软件版本Docker:26.1.3Mysql:8.4.0 GTID主从复制1.准备主从两台服务器2.两台服务器分别创建DockerCompose文件services:mysql:image:mysql:8.4.0ports:-"3......
  • python 深浅拷贝
    浅拷贝copy函数就是浅拷贝copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝对拷贝的对象开辟新的内存空间进行存储,子对象不会开辟新的空间list1=[1,2,3]list2=['a',list1]list3=list2.copy()print(id(list1))print(id(list2))#三个id都不一样prin......
  • 美团面试:说说Netty的零拷贝技术?
    零拷贝技术(Zero-Copy)是一个大家耳熟能详的技术名词了,它主要用于提升IO(Input&Output)的传输性能。那么问题来了,为什么零拷贝技术能提升IO性能?1.零拷贝技术和性能在传统的IO操作中,当我们需要读取并传输数据时,我们需要在用户态(用户空间)和内核态(内核空间)中进行数据拷贝,它的执......
  • 浅拷贝与深拷贝
    浅拷贝过程最大的问题是共享同一块内存,容易引发内存问题,下面这个例子就是浅拷贝在析构的时候出现段错误。#include<iostream>#include<cstring>//forstrcpy_s#include<thread>classMyClass{public:char*data;MyClass(constchar*str){d......
  • Java 实体类之间的互相复制
    Java实体类之间的互相复制,一般可以通过以下几种方法实现:1.手动赋值:最简单的方法是通过手动为每个属性设置值来实现复制。但是在实际应用中,即使实体类属性较少,手动复制也很繁琐。2.BeanUtils:ApacheBeanUtils是一个常用的Java类库,可以用于快速实现JavaBean之间的互相赋值。......
  • 用fscanf\fprintf fgetc\fputc fgets\fputs实现文件拷贝。
     1.fscanf\fprintf#include<stdio.h>intmain(intargc,constchar*argv[]){FILE*fp=fopen("./1.c","r");if(NULL==fp){perror("fopen");return-1;}FILE*fp1=fopen......
  • 手写深拷贝
    JSON不支持日期、正则、undefined、函数,环结构JSON.parse(JSON.stringify(obj))JS深拷贝(递归、判断类型、避免环)constcloneDeep=(a,cache)=>{if(!cache){cache=newMap();//避免全局变量,仅第一次拷贝创建}if(cache.get(a)){//避免环......
  • “深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“
        前言:在Java编程中,深拷贝(DeepCopy)与浅拷贝(ShallowCopy)是两个非常重要的概念。它们涉及到对象在内存中的复制方式,对于理解对象的引用、内存管理以及数据安全都至关重要。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-C......