js实现所有数据类型的深拷贝函数
时间: 2023-02-07 15:55:55 浏览: 74
可以使用递归的方式实现深拷贝函数。首先,判断当前要拷贝的数据是不是对象或数组。如果是,则遍历这个对象或数组的所有属性,并使用递归的方式进行拷贝。如果不是,则直接返回这个值。
这里是一个示例代码:
```
function deepCopy(obj) {
if (typeof obj !== 'object') {
return obj;
}
var newObj = Array.isArray(obj) ? [] : {};
for (var key in obj) {
newObj[key] = deepCopy(obj[key]);
}
return newObj;
}
```
希望这对你有帮助。
相关问题
js函数深拷贝怎么实现要写注释
很好的问题!深拷贝是指完全复制一个对象,包括其中所有的嵌套对象和属性。以下是一个使用递归实现深拷贝的 JavaScript 函数:
```
function deepCopy(obj) {
if (typeof obj !== "object" || obj === null) {
// 如果不是对象或为 null 即为基础数据类型,直接返回
return obj;
}
// 初始化新对象,具有原始对象的类型
const newObj = Array.isArray(obj) ? [] : {};
// 遍历原始对象中的属性并递归执行深拷贝
for (const key in obj) {
newObj[key] = deepCopy(obj[key]);
}
// 返回新对象
return newObj;
}
```
该函数接收一个对象参数 obj ,检查该对象是否为基础数据类型(即 number 、 string 、 boolean 、 null 或 undefined ),如果是,直接返回该对象。如果该对象为嵌套对象,则递归调用该函数直至所有嵌套对象都被复制。最后,该函数返回一个完全复制的新对象。
需要注意的是,深拷贝函数对于拷贝 Date 、 Map 、 Set 等对象类型需要进行特殊处理,因为它们具有特殊的属性和方法。在实际使用时还需根据具体需求进行扩展。
js深拷贝symbol类型的数据
在 JavaScript 中,我们可以使用 `JSON.parse(JSON.stringify(obj))` 来实现对象的深拷贝。然而,这种方法并不能拷贝 Symbol 类型的数据。
要深拷贝 Symbol 类型的数据,我们可以使用递归函数来实现。例如:
```
function deepCopy(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (obj instanceof Symbol) {
return Symbol(obj.description);
}
if (obj instanceof Date) {
return new Date(obj);
}
if (obj instanceof RegExp) {
return new RegExp(obj);
}
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
```
这个函数使用了递归来处理对象的属性。如果属性的值是对象,则继续递归拷贝;如果是基本数据类型,则直接返回。
使用方法:
```
let obj = {a: 1, b: Symbol('symbol')};
let copy = deepCopy(obj);
```
这样,`copy.b` 就是一个拷贝的 Symbol,与原来的 `obj.b` 完全独立。