js深拷贝function
时间: 2023-10-04 22:14:13 浏览: 43
以下是一个简单的 JavaScript 深拷贝函数:
```
function deepCopy(obj) {
if (typeof obj !== 'object') {
return obj;
}
let newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
newObj[key] = deepCopy(obj[key]);
}
return newObj;
}
```
这个函数首先检查传入的参数是否为对象,如果不是对象则直接返回原值,如果是对象则创建一个新的对象或者数组,然后遍历原对象的属性,并使用递归调用将每个属性的值进行深拷贝,并将其赋值给新对象的对应属性。最后返回新对象。
相关问题
js 深拷贝
在 JavaScript 中,对象和数组都是引用类型,当我们对一个对象或数组进行赋值操作时,其实赋值的是地址,而非实际的值。所以如果我们直接将一个对象或数组赋值给另一个变量,那么改变其中一个变量的值,另一个变量也会跟着改变。这就是浅拷贝的问题。
为了解决浅拷贝的问题,我们需要使用深拷贝。深拷贝是指将一个对象或数组中的所有属性和元素都复制到一个新的对象或数组中,并且新的对象和数组与原对象和数组没有任何关系,彼此独立。
以下是一个简单的深拷贝函数:
```javascript
function deepClone(obj) {
// 如果是 null 或者其他基本类型,则直接返回
if (obj === null || typeof obj !== "object") {
return obj;
}
// 判断是对象还是数组
const newObj = Array.isArray(obj) ? [] : {};
// 遍历原对象的属性或元素
for (let key in obj) {
// 递归调用深拷贝函数
newObj[key] = deepClone(obj[key]);
}
return newObj;
}
```
该函数接受一个对象或数组作为参数,返回一个深拷贝后的新对象或数组。该函数使用递归实现深拷贝,首先判断传入的参数是否为 null 或者其他基本类型,如果是,则直接返回。如果不是基本类型,则判断传入的参数是对象还是数组,并创建一个空的对象或数组。然后遍历原对象的属性或元素,递归调用函数进行深拷贝,并将拷贝后的属性或元素添加到新的对象或数组中。最后返回新的对象或数组即可。
js深拷贝
JS 中的深拷贝可以通过递归实现。递归遍历对象或数组的每个属性,如果属性是基本类型则直接复制,如果是引用类型则再次递归遍历。以下是一个简单的深拷贝函数实现:
```
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
let newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
newObj[key] = deepClone(obj[key]);
}
return newObj;
}
```
使用方法:
```
let obj1 = {a: 1, b: {c: 2}};
let obj2 = deepClone(obj1);
obj1.b.c = 3;
console.log(obj2.b.c); // 输出2,表示obj2是深拷贝后的对象
```
需要注意的是,这个深拷贝函数只能处理纯 JSON 对象,如果对象中有函数、正则表达式等特殊类型,则需要特殊处理。