关于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))