用最直白的话带你理解JavaScript深浅复制

本文深入探讨JavaScript中的深复制和浅复制概念。深复制是指创建数据的完整副本,改变副本不会影响原始数据;而浅复制则是复制引用,改变其中一个会影响另一个。通过实例解析了如何实现深浅复制,并通过代码展示了它们的区别,帮助读者更好地理解和应用这两种复制方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用最直白的话带你理解JavaScript深浅复制

要理解深浅复制前,我们要知道什么是深浅复制

深复制:直接将数据赋值给对应的变量

// 这些直观的数据 赋值给变量就是深复制
let num = 1;
let str ="str";
let nums = [1,2,3]

浅复制:多个变量共同指向堆内的同一个内容/地址

//此时a 和 b 共同指向堆内的同一个内容即 [4,5,6] 
let a = [4,5,6]
let b = a;

深入一下

浅复制就是把地址赋值给对应的变量,并不是直接赋值数据,类似于指针。所以改变 a 的值时,b 的值也发生相应的改变,因为此时 a、b 的地址是一致的。

深复制是直接将数据赋值给变量,变量 a、b 的地址是不一致的,所以当 a 的值发生改变时,b 的值不会发生改变。

实践一下

function f(e){
    // 两个return是为了高亮 执行①就注释② 执行②就注释① 

    //e 直接重新赋值 并不会改变 nums
    return e = [4,5,6] // ①
    //e 单个赋值 会改变  nums
    return e[0] = 3  // ②
}

let nums =[7,8,9]; 
f(nums);
console.log(nums); 
/**
 * ①[7,8,9]
 * ②[3,8,9]
 */

讲解

讲解标记①

传进来的参数是浅复制 相当于 let e = nums 属于浅复制的 此时是同一个地址

将参数重新赋予直观的数据 参数e由浅复制变为深复制

参数分配了新的地址 此时参数和nums 不在是同一个地址 所以参数的改变不会影响到nums; nums依旧是[7,8,9]

讲解标记②

我们并没有给参数直接复制,所以此时 参数和nums的地址还是一致的,

当我们改动其中一个数的时候,对应的地址内的内容也会改变,

由于nums的地址和参数地址还是一致的,所以nums的值也会改变,nums变成[3,8,9]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alaone的笔记整理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值