JavaScript 赋值,浅拷贝,深拷贝(一个例子深入浅出直接讲清楚)

本文通过实例解析JavaScript中的浅拷贝和深拷贝概念,深入理解引用值在拷贝过程中的差异。从好学生A的作业被坏学生B篡改的故事出发,阐述浅拷贝如何导致两个对象共享同一内存空间,从而互相影响,以及深拷贝如何确保完全独立的副本。通过浅拷贝1和浅拷贝2的对比,展示了浅拷贝仅拷贝对象表面属性,而深拷贝递归拷贝所有层级,确保了对象的独立性。最后总结了浅拷贝和深拷贝的应用场景及其重要性。
摘要由CSDN通过智能技术生成

前提知识

见博客:原始值和引用值

例子

老师布置了一份论文,好学生的论文中还引用了他之前写的博客,也就是说

//好学生A
A_Homework = {
    content:'论证1+1证明过程,见博客:',
    blog:{
        content:'因为2=1+1,所以1+1=2'
    }
}

浅拷贝1

坏学生B:一把抢过了A的作业本,在名字那一栏由加上了自己的名字(变成小组作业)

B_Homework = A_Homework

所以此时A和B和作业就是同一个作业,都可以修改作业内容和博客内容,且都会造成影响
这时B在作业本第一行加了一句

B_Homework.firstCuntent='这是A和B的小组作业'

这个时候我们可以发现A的作业本也加了这一句(因为他们本来就是一本作业

console.log(A_Homework.firstCuntent)

输出:这是A和B的小组作业

浅拷贝2

B终于良心发现,意识到直接占领别人的劳动成果是不对,于是B把A的作业抄了一遍

B_Homework={}
B_Homework.content = A_Homework.content

但是B抄到一半发现还要引用博客内容,B偷懒就直接写了A的博客地址

B_Homework.blog = A_Homework.blog

此时B作业本的内容是B的,不是A的,所以A和B修改content不会影响到对方

B_Homework.content = '我是B,我的论证过程见博客:'

这个时候我们可以看一下A的作业内容受到影响了吗

console.log(A_Homework.content)

输出:论证1+1证明过程,见博客:
但是如果B顺着A的博客地址改变了A博客的内容,A会受到影响

B_Homework.blog.content='我是B,我的论证过程是:因为2=1+1,所以1+1=2'
console.log(A_Homework.blog.content)

输出:我是B,我的论证过程是:因为2=1+1,所以1+1=2

深拷贝

B终于大彻大悟,意识到即使抄,也要完完整整的抄
于是B既在自己的作业本上抄了A的内容,又在自己的博客上抄了A的博客

B_Homework={}
B_Homework.content = A_Homework.content
B_Homework.blog={}
B_Homework.blog.content = A_Homework.blog.content

此时B修改他自己的博客会影响A吗

B_Homework.blog.content = '我是B,我不会'
console.log(A_Homework.blog.content)

输出:因为2=1+1,所以1+1=2
此时B终于彻彻底底的写了一份自己的作业,再也不会影响A

总结

原因

以浅拷贝1为例

  • js对引用值的存储是只存地址
  • 所以在拷贝引用值时只会将A的地址赋给B
  • 这就导致有A和B指向一块内存空间(可以理解为A和B就是同一个东西,就像小明的小名叫二蛋,那么“小明”和“二蛋”其实都是一个人)

浅拷贝和深拷贝的区别

浅拷贝只拷贝了对象的部分属性,而深拷贝则递归拷贝了所有层级。

  • 浅拷贝:部分属性只拷贝了地址
  • 深拷贝:重新拷贝了一整个东西
  • 通俗点:浅拷贝是给小明起了个小名;深拷贝是制造了一个小明的复制人
  • 体现为:浅拷贝会使二者相互影响,深拷贝则因为二者相互独立不会受到影响

赋值与浅深拷贝

在弄清楚这块内容之前,我一直认为赋值,浅拷贝,深拷贝是三个同层级的东西:

  • 赋值是直接A=B
  • 浅拷贝是将A的1到(n-1)个属性的值赋给B
  • 深拷贝是将A的所有n个属性的值赋给B

但在写博客的时候才发现,赋值,浅拷贝,深拷贝不是同层级的东西:

  • 赋值是手段,是过程
  • 浅拷贝,深拷贝是最终实现的效果
  • 浅拷贝,深拷贝的实现都是通过赋值(=)
  • 可以把赋值比作学习,那么浅拷贝就是没学好,深拷贝就是学的很好
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值