-
浅拷贝 :只复制一层,对象里的子对象仍是引用。
-
深拷贝:所有层级的属性都会被完整复制,互不影响。
浅拷贝
常见方法:
js
const newObj = { ...oldObj }; // ES6 展开运算符
const newObj = Object.assign({}, oldObj); // assign 方式
const newArr = oldArr.slice(); // 数组浅拷贝
const newArr = [...oldArr]; // 数组展开运算符
js
const obj1 = {
name: 'Alice',
info: {
age: 25
}
};
const obj2 = { ...obj1 }; // 浅拷贝
obj2.name = 'Bob'; // ✅ 只影响 obj2
obj2.info.age = 30; // ❗️同时改变 obj1.info.age
console.log(obj1.info.age); // 30
深拷贝
深拷贝会递归地复制对象的所有层级,两个对象完全独立。
方法1 :JSON.parse(JSON.stringify(obj))
js
const obj2 = JSON.parse(JSON.stringify(obj1));
不能拷贝函数、
undefined
、循环引用、Symbol、BigInt、日期、Map、Set 等复杂结构。
方法二:自己写递归函数(复杂)
js
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
if (Array.isArray(obj)) {
return obj.map(item => deepClone(item));
}
const clone = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
方法三:使用库
使用现成的库,如:
lodash
:_.cloneDeep(obj)
rfdc
(更轻量)
bash
npm install lodash
js
import _ from 'lodash';
const newObj = _.cloneDeep(oldObj);