JS中如何理解浅拷贝和深拷贝?

浅拷贝我的理解就是只是一个引用指向,内存里面并没有开辟一个新的空间,也就是一个快捷方式。
而深拷贝是不光创建了一个新的指向,同时这个指向一个新的内存空间,这个空间的内容和之前被拷贝的空间内容是一样的。
不知道我的理解是否正确。
有没有大神用代码示例演示下:

阅读 3.4k
5 个回答
let origin = {
    a: 1
}
let shallowCopy = origin // 浅拷贝
let deepCopy = {...origin} // 深拷贝
console.log(origin) // {a:1}
console.log(shallowCopy) // {a:1}
console.log(deepCopy) // {a:1}
origin.a = 2
console.log(origin) // {a:2}
console.log(shallowCopy) // {a:2}
console.log(deepCopy) // {a:1}

浅拷贝就是

Object A = new Object();
Object B = A;

深拷贝就是把
Object B = new Object;
然后把A里面的每一个属性都复制过去。
是和A独立开来的。

你可以理解成 浅拷贝其实就是建立个索引 拷贝出来的东西都指向的同一个
深拷贝就是完完全全的拷贝个独立的东西 和被拷贝的已经没有关系了

概念的理解
1.深拷贝和浅拷贝只针对像Object, Array这样的引用类型数据。
2.浅拷贝是对对象引用地址进行拷贝,拷贝后,改其中一个对象的属性,则另一个对象的属性也会改变。
3.深拷贝会新开一个引用地址进行拷贝,拷贝后,修改一个对象的属性,不会改变另一个对象的属性。

浅拷贝的例子

var obj = {a:1, b:2};
var obj2 = obj;
obj2.a = 3;
console.log(obj.a); // 3

深拷贝的例子

var obj2 = Object.assign({},obj);
obj2.a = 3;
console.log(obj.a); // 1

改变了obj2的a属性,但obj的a并没有发生变化。

首先,浅拷贝也是会占用内存的,但是占用的内存相对较小。

const objectA = {
  name: 'test',
  obj: {
    name: 'test2',
  },
}

/* 浅拷贝 */
const objectB = Object.assign({}, objectA)

/* 深拷贝 */
const objectC = Object.assign({}, objectA)
objectC.obj = Object.assign({}, objectA.obj)

/* 三个输出看起来都跟A一样 */
console.log(objectA, objectB, objectC)

/* 对比AB */
/* 输出: false true true */
console.log(
  objectA === objectB,
  objectA.name === objectB.name,
  objectA.obj === objectB.obj, // B里面的obj,还是原来的obj
)

/* 对比AC */
/* 输出: false true false */
console.log(
  objectA === objectC,
  objectA.name === objectC.name,
  objectA.obj === objectC.obj, // C里面的obj,已经是一个新的对象,不再是原来的obj
)

上面的demo可以看到,对于基本类型跟普通变量赋值,深浅拷贝最主要的区别在于Object(注意数组也是Object):
浅拷贝,只是吧第一层的所有值,做了简单的赋值操作。
深度拷贝,会把嵌套的对象重新生成一摸一样结构新对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题