JavaScript 深拷贝(deep copy)和浅拷贝(shallow copy)

 

参考:

  1.  
const a = 5 let b = a // this is the copy b = 6  console.log(b) // 6console.log(a) // 5
复制代码

 

复合数据类型(有的资料叫做引用数据类型)——对象 和 数组

技术上讲,数组也是对象。

这种类型的值,只在初始化的时候存储一次。赋值给变量也仅仅是创建了一个指向这个值的引用。

拷贝 b = a,改变 b 中的属性 pt 的值,a 中包含的 pt 的值也改变了,因为 a 和 b 实际上指向的是同一个对象:

复制代码
const a = {   en: 'Hello',   de: 'Hallo',   es: 'Hola',   pt: 'Olà' } let b = a b.pt = 'Oi' console.log(b.pt) // Oiconsole.log(a.pt) // Oi
复制代码

 

上面这个例子就是一个浅拷贝

新的对象有着原对象属性的一份精确拷贝。如果属性值是原始类型,拷贝的就是原始类型值,如果属性是引用类型,拷贝的就是内存地址,如果其中一个对象改变了这个地址或者改变了内存中的值,另一个对象的属性也会变化。

也就是说浅拷贝只拷贝了第一层的原始类型值,和第一层的引用类型地址。

 

浅拷贝的场景

 

展开操作符 Spread operator

使用这个操作符可以将所有的属性值复制到新对象中。

复制代码
const a = {   en: 'Bye',   de: 'Tschüss' } let b = {...a} b.de = 'Ciao' console.log(b.de) // Ciaoconsole.log(a.de) // Tschüss
复制代码

还可以合并两个对象,比如 const c = { ...a, ...b}.

 

Object.assign()

用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,然后返回目标对象。

第一个参数是被修改和最终返回的值,第二个参数是你要拷贝的对象。通常,只需要给第一个参数传入一个空对象,这样可以避免修改已有的数据。

复制代码
const a = {   en: 'Bye',   de: 'Tschüss' } let b = Object.assign({}, a) b.de = 'Ciao' console.log(b.de) // Ciaoconsole.log(a.de) // Tschüss
复制代码

 

拷贝数组

复制代码
const a = [1,2,3] let b = [...a] b[1] = 4 console.log(b[1]) // 4 console.log(a[1]) // 2

                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信