在JavaScript中,我们经常会用到一些对象,比如数组、字典、函数来保存我们的数据,这些对象有时候需要被复制。今天我们就来看一下什么是对象引用,什么叫浅拷贝,什么叫深拷贝。
在JavaScript中,一般对象是通过引用(reference)存储的,也就是每一个变量都指向一个地址,这个地址包含了对象创建时候的所有属性等信息,而多个变量指向同一个地址,它们都是指向引用,所以也叫引用。
换句话说,当我们想要拷贝一个对象的时候,只拷贝这个对象的引用,也就是说复制的对象只是指向同一个地址,它们拥有相同的属性和方法,这就叫引用传递(reference passing)。
浅拷贝是指拷贝了一个对象的引用,但是这个引用并没有真正拷贝这个对象内部的数据,所以复制的对象拥有的属性和方法是同一个,可以通过Object.assign
实现浅拷贝。
例子:
let a = { name: 'Bob' };
let b = Object.assign({}, a); // 浅拷贝
a.name = 'John';
console.log(b.name); // "John"
深拷贝是指拷贝了一个对象的数据,而不是拷贝一个引用,复制的对象拥有完全独立的属性和方法,可以使用JSON.parse(JSON.stringify())
实现深拷贝。
例子:
let a = { name: 'Bob' };
let b = JSON.parse(JSON.stringify(a)); // 深拷贝
a.name = 'John';
console.log(b.name); // "Bob"
我们在实际的开发中,经常会遇到拷贝引用的情况,这时候为了不影响原有的数据,就需要拷贝真正的数据,不要仅仅引用同一个数据,让我们学会使用浅拷贝和深拷贝来拷贝数据。