js中浅拷贝和深拷贝的区别
时间: 2025-04-21 10:44:02 浏览: 19
### JavaScript 中浅拷贝与深拷贝的区别
#### 浅拷贝特性
浅拷贝仅复制对象的第一层属性。对于基本数据类型(如 `number`、`string` 和 `boolean`),这表现为值的直接复制;而对于复杂的数据结构(如数组或对象),则只是复制其引用而非实际内容[^2]。
```javascript
// 对于基本类型的浅拷贝
let num1 = 5;
let num2 = num1;
num2 = 10;
console.log(num1); // 输出: 5
// 对象类型的浅拷贝展示
const person1 = {
name: 'Alice',
age: 30,
};
const person2 = Object.assign({}, person1);
person2.age = 40;
console.log(person1.age); // 输出: 30 (未受影响)
// 修改嵌套对象的情况
const user1 = {
profile: { city: 'Beijing' }
};
const user2 = Object.assign({}, user1);
user2.profile.city = 'Shanghai';
console.log(user1.profile.city); // 输出: Shanghai (受到影响)
```
#### 深拷贝特性
相比之下,深拷贝不仅复制最外层的对象,还会递归地处理内部所有的子对象,从而确保源对象及其所有后代都被彻底克隆出来,形成全新的独立副本[^1]。
```javascript
// 使用JSON方法实现简单场景下的深拷贝
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
const employee = {
id: 1,
details: {
department: 'Engineering'
},
};
const clonedEmployee = deepClone(employee);
clonedEmployee.details.department = 'HR';
console.log(clonedEmployee.id === employee.id); // true
console.log(clonedEmployee.details !== employee.details);// true
console.log(employee.details.department); // Engineering
```
值得注意的是,在某些特殊情况下,比如循环引用或是含有不可枚举属性的对象时,简单的基于字符串化的方法可能会失效或者丢失特定行为[^4]。因此实践中也常借助第三方库如 Lodash 的 `cloneDeep()` 来完成更可靠的深拷贝操作。
阅读全文
相关推荐


















