关于JS中的深浅拷贝与 = 的问题

分析=与扩展运算符(…)以及Object.assign

假如 A 有一台电脑computer , 里面有数据 computer =[1, {'treasureMap':'gold'}]
A 准备把电脑和我(B)共享.  B = computer
我需要 打开电脑,打开文件夹(路径), 才能访问里面的数据,如果我把里面的数据修改 computer[0] = 99
那么A之后打开电脑,打开文件夹之后,发现里面的数据也改变了
解释:  = 与 拷贝的问题
let computer =[1, {'treasureMap':'gold'}]
let B = computer
B[0] = 99
computer[0]  // 99
	
假如我是通过U盘拷贝A电脑里面的数据 B = [...computer] 或者 Object.assign({},computer)
我修改我自己U盘里面的数据. B[0] = 99
但是A电脑的数据并不会受影响
解释: 普通数据类型浅拷贝问题
B = [...computer]
B[0] = 99
console.log(B)				//[99, {…}] 
console.log(computer) 	    // [1, {…}] 

假如我发现我拷贝的数据有一张藏宝图 treasureMap, 上面有宝藏的位置
我通过treasureMap(藏宝图),把宝藏gold拿走了.
当A也通过藏宝图去找宝藏的时候,发现宝藏已经没有了
解释: 引用类型数据浅拷贝问题
console.log(computer)  //[1, {'treasureMap':'gold'}]
B = [...computer]
B[1].treasureMap = 'nothing'
console.log(computer)  //[1,{ treasureMap: 'nothing'}]

当数据是对象时,是一样的效果

	
	let obj = {
            name: 'sjh',
            fn: {
                age: 18
            }
        }
    let B = Object.assign({},obj)

在这里插入图片描述

浅拷贝与深拷贝

浅拷贝: 浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用

数组是引用类型,但是数组元素是基本类型(表面数据),就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,无论对新旧数组的哪一个进行了修改,两者都会发生变化
对象是引用类型,但是对象元素是基本类型(表面数据),就会拷贝一份,互不影响,如果是对象或者数组,就是互相影响
常见浅拷贝的方式:Object.assign()扩展运算符

深拷贝: 拷贝多层,每一级别的数据都会拷贝出来,重新开辟一块内存空间,用来存放源对象的值
常见深拷贝的方式:JSON.parse()JSON.stringify()配合使用

用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。
这种方法操作的对象的属性值不能是 undefined、symbol、函数、日期和正则。 

JSON.parse(JSON.stringify(obj))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值