js浅拷贝、深拷贝一个引用类型数据
时间: 2023-11-24 12:46:29 浏览: 29
在 JavaScript 中,浅拷贝和深拷贝是用来复制一个引用类型数据的两种不同方式。
浅拷贝是指创建一个新的对象,然后将原始对象的属性值复制到新对象中。但是,如果属性值是引用类型数据(如数组、对象等),则新对象和原始对象会共享这个引用类型数据的地址,修改其中一个对象的属性值会影响到另一个对象。
深拷贝是指创建一个全新的对象,并将原始对象的所有属性值都复制到新对象中。如果属性值是引用类型数据,会递归地进行深拷贝,即创建一个新的引用类型数据,并将原始引用类型数据的属性值复制到新对象中。这样,新对象和原始对象完全独立,修改其中一个对象的属性值不会影响到另一个对象。
下面是使用 JavaScript 实现浅拷贝和深拷贝的示例代码:
浅拷贝:
```javascript
function shallowCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
newObj[key] = obj[key];
}
return newObj;
}
```
深拷贝:
```javascript
function deepCopy(obj, cache = new WeakMap()) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
if (cache.has(obj)) {
return cache.get(obj);
}
const newObj = Array.isArray(obj) ? [] : {};
cache.set(obj, newObj);
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
newObj[key] = deepCopy(obj[key], cache);
}
}
return newObj;
}
```