在JavaScript中,对象的拷贝可以分为浅拷贝和深拷贝。
当我们复制一个对象的时候,往往需要了解的就是浅拷贝和深拷贝的区别及实现方式。
以下是对JavaScript中深拷贝的详细讲解。
![JavaScript中深拷贝的实现方式详解 图片[1]-JavaScript中深拷贝的实现方式详解-不念博客](https://www.bunian.cn/wp-content/uploads/2023/05/qqjietu20230522152724.png)
深拷贝与浅拷贝的区别
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。
如果属性是基本类型,拷贝的就是基本类型的值,如果属性是内存地址(也就是引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
深拷贝会创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
实现深拷贝的方法
1. 使用JSON对象的parse和stringify
这是最简单的一种实现深拷贝的方法,但是这种方法有局限性:
- 会忽略 undefined
- 不能序列化函数
- 不能解析循环引用的对象
let obj = {a:1, b:2, c:{d:3}}let newObj = JSON.parse(JSON.stringify(obj));let obj = {a:1, b:2, c:{d:3}} let newObj = JSON.parse(JSON.stringify(obj));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;}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; }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);let _ = require('lodash'); let obj = {a:1, b:2, c:{d:3}} let newObj = _.cloneDeep(obj);let _ = require('lodash'); let obj = {a:1, b:2, c:{d:3}} let newObj = _.cloneDeep(obj);
以上是JavaScript中深拷贝的实现方式,这种技巧在实际的开发中非常实用,希望对你有所帮助。
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END