js 浅拷贝 和深拷贝
时间: 2024-09-14 16:01:43 浏览: 44
在JavaScript中,有两种主要的数据复制方式:浅拷贝和深拷贝。
**浅拷贝**[^1]:
当你执行简单的赋值操作(如`var newObj = obj;`)或者使用`for...in`循环逐个属性复制(如示例所示)时,得到的是浅拷贝。这意味着如果原对象中有复杂类型的属性(如对象或数组),这些复杂类型只复制了引用,而不是实际的数据。比如:
```javascript
var obj = {
id: 1,
name: 'Andy',
msg: { age: 18 }
};
var newObj = {};
// shallow copy (only a reference to the inner object)
newObj = obj;
console.log(newObj); // 输出:{ id: 1, name: 'Andy', msg: { age: 18 } }
// 修改msg不会影响原始对象
newObj.msg.age = 20;
console.log(obj.msg.age); // 输出:20
```
**深拷贝**:
相比之下,深拷贝会创建每个属性的新实例,包括嵌套的对象和数组。这可以防止修改一个对象影响到其他地方的副本。JavaScript并没有内置的深拷贝函数,但可以通过递归或其他库来实现,例如使用`JSON.parse()`和`JSON.stringify()`组合,虽然这种方法对日期和其他非可序列化对象无效。
```javascript
function deepCopy(obj) {
if (obj instanceof Array) {
return [...obj];
} else if (typeof obj === 'object') {
let clone = {};
for (let key in obj) {
clone[key] = deepCopy(obj[key]);
}
return clone;
} else {
return obj;
}
}
var newObj = deepCopy(obj);
newObj.msg.age = 25; // 修改不会影响原始对象
console.log(obj.msg.age); // 输出:18
```
阅读全文