js 深拷贝的方式
时间: 2023-07-08 19:10:08 浏览: 68
在 JavaScript 中,实现深拷贝的方式有多种,下面介绍几种常用的方式:
1. 递归实现深拷贝
递归实现深拷贝是最常用的方式,具体实现可以参考上一个问题中提供的 `deepClone` 函数。
2. JSON.parse(JSON.stringify(obj))
这种方式利用了 JSON.stringify 和 JSON.parse 两个方法,先将对象转为 JSON 字符串,再将 JSON 字符串转为新的对象。该方式可以实现深拷贝,但是有一些限制:
- 不能拷贝函数、RegExp 等特殊对象;
- 不能解决循环引用的问题;
- 对象中如果有 undefined、NaN、Infinity 等特殊值会被转成 null。
示例代码:
```javascript
const newObj = JSON.parse(JSON.stringify(obj));
```
3. 使用第三方库
除了自己实现深拷贝函数之外,也可以使用第三方库,如 lodash 的 cloneDeep 方法。该方法可以实现深拷贝,并且处理了循环引用的问题。
示例代码:
```javascript
const _ = require('lodash');
const newObj = _.cloneDeep(obj);
```
需要注意的是,使用第三方库会增加代码的依赖性,同时也可能会增加代码体积。
相关问题
js 多种深拷贝方式 代码展示
当然可以!下面是几种常见的 JavaScript 深拷贝方式的代码示例:
1. 使用 JSON 序列化和反序列化:
```javascript
const obj = { foo: 'bar', nested: { num: 42 } };
// 使用 JSON.stringify 和 JSON.parse 进行深拷贝
const deepCopy = JSON.parse(JSON.stringify(obj));
console.log(deepCopy);
```
2. 使用递归实现深拷贝:
```javascript
function deepClone(obj) {
if (typeof obj !== 'object') {
return obj; // 非对象直接返回
}
const clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]); // 递归复制子对象
}
}
return clone;
}
const obj = { foo: 'bar', nested: { num: 42 } };
// 使用自定义的 deepClone 函数进行深拷贝
const deepCopy = deepClone(obj);
console.log(deepCopy);
```
3. 使用第三方库如 lodash 的深拷贝方法:
```javascript
const _ = require('lodash');
const obj = { foo: 'bar', nested: { num: 42 } };
// 使用 lodash 的 cloneDeep 方法进行深拷贝
const deepCopy = _.cloneDeep(obj);
console.log(deepCopy);
```
以上是三种常见的 JavaScript 深拷贝方式的代码示例。根据实际需求和场景选择适合的方式进行深拷贝。
js 实现深拷贝的方式
1. 递归拷贝:递归遍历对象的每一个属性,进行拷贝。如果属性是基本类型,直接拷贝;如果是引用类型,递归调用拷贝函数。
2. JSON 序列化/反序列化:使用 JSON.stringify() 将对象序列化成字符串,再使用 JSON.parse() 将字符串反序列化为新的对象。这种方法可以处理大部分数据类型,但是无法处理函数、RegExp 对象等特殊类型,也无法处理循环引用的情况。
3. Object.assign() 方法:使用 Object.assign() 方法将源对象的所有属性复制到目标对象中,如果属性是引用类型,复制的是引用地址。可以通过创建一个空对象作为目标对象,从而实现深拷贝。但是该方法也无法处理循环引用的情况。
4. Lodash 库:Lodash库提供了 _.cloneDeep() 方法,可以实现深拷贝。该方法可以处理循环引用的情况,但是可能会存在性能问题。
阅读全文