在JavaScript中,对象的拷贝可以分为浅拷贝和深拷贝。
当我们复制一个对象的时候,往往需要了解的就是浅拷贝和深拷贝的区别及实现方式。
以下是对JavaScript中深拷贝的详细讲解。
深拷贝与浅拷贝的区别
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。
如果属性是基本类型,拷贝的就是基本类型的值,如果属性是内存地址(也就是引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
深拷贝会创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
实现深拷贝的方法
1. 使用JSON对象的parse和stringify
这是最简单的一种实现深拷贝的方法,但是这种方法有局限性:
- 会忽略 undefined
- 不能序列化函数
- 不能解析循环引用的对象
let obj = {a:1, b:2, c:{d:3}}
let newObj = JSON.parse(JSON.stringify(obj));
2. 递归实现深拷贝
可以通过递归的方式,判断对象的每个属性,如果属性为对象,再递归拷贝该对象,直到拷贝所有的基本类型为止。
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let cloneObj = Array.isArray(obj) ? [] : {};
for (let i in obj) {
cloneObj[i] = deepClone(obj[i]);
}
return cloneObj;
}
3. 使用第三方库实现深拷贝
例如lodash库的_.cloneDeep方法,可以非常方便的实现深拷贝。
let _ = require('lodash');
let obj = {a:1, b:2, c:{d:3}}
let newObj = _.cloneDeep(obj);
以上是JavaScript中深拷贝的实现方式,这种技巧在实际的开发中非常实用,希望对你有所帮助。