js实现浅拷贝和深拷贝
时间: 2023-10-24 16:12:37 浏览: 93
浅拷贝是指创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
实现浅拷贝可以使用 Object.assign 或者展开运算符(...)来实现。
```javascript
// 使用 Object.assign 实现浅拷贝
const sourceObj = { name: 'Bob', age: 20 };
const targetObj = Object.assign({}, sourceObj);
console.log(targetObj); // { name: 'Bob', age: 20 }
// 使用展开运算符实现浅拷贝
const sourceObj = { name: 'Bob', age: 20 };
const targetObj = { ...sourceObj };
console.log(targetObj); // { name: 'Bob', age: 20 }
```
深拷贝是指创建一个新对象,这个对象拥有原始对象属性的一份精确拷贝,如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是引用类型的地址,所以如果其中一个对象改变了这个地址,就不会影响到另一个对象。
实现深拷贝可以使用 JSON.parse(JSON.stringify()) 或者递归实现。
```javascript
// 使用 JSON.parse(JSON.stringify()) 实现深拷贝(只适用于对象中没有函数、日期等特殊类型的情况)
const sourceObj = { name: 'Bob', age: 20, hobbies: ['basketball', 'reading'] };
const targetObj = JSON.parse(JSON.stringify(sourceObj));
console.log(targetObj); // { name: 'Bob', age: 20, hobbies: ['basketball', 'reading'] }
// 递归实现深拷贝
function deepClone(obj) {
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;
}
const sourceObj = { name: 'Bob', age: 20, hobbies: ['basketball', 'reading'] };
const targetObj = deepClone(sourceObj);
console.log(targetObj); // { name: 'Bob', age: 20, hobbies: ['basketball', 'reading'] }
```
阅读全文