const a = 5 let b = a // this is the copy b = 6 console.log(b) // 6console.log(a) // 5
新增AI编程课程,引领技术教育新趋势
复合数据类型(有的资料叫做引用数据类型)——对象 和 数组
技术上讲,数组也是对象。
这种类型的值,只在初始化的时候存储一次。赋值给变量也仅仅是创建了一个指向这个值的引用。
拷贝 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