数组和对象的深拷贝、浅拷贝方法有所不同,以下是常见的实现方式:
一、浅拷贝方法(数组和对象通用/专用)
浅拷贝只复制表层数据,嵌套的引用类型仍共享内存。
1. 数组的浅拷贝
- 扩展运算符(...): const arrCopy = [...originalArr];
- Array.prototype.slice(): const arrCopy = originalArr.slice();
- Array.prototype.concat(): const arrCopy = [].concat(originalArr);
2. 对象的浅拷贝
- 扩展运算符(...): const objCopy = {...originalObj};
- Object.assign(): const objCopy = Object.assign({}, originalObj);
二、深拷贝方法(数组和对象通用/专用)
深拷贝会复制所有嵌套数据,原数据和拷贝数据完全独立。
1. 通用方法(数组和对象均可)
- JSON.parse(JSON.stringify()):
简单易用,但有局限性(不支持函数、Symbol、循环引用等)。
示例: const deepCopy = JSON.parse(JSON.stringify(original));
- 递归实现:
自定义函数遍历所有属性,对引用类型递归拷贝,可处理复杂场景。
示例:
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepClone(obj[key]);
}
}
return copy;
}
2. 其他工具方法
- Lodash库的_.cloneDeep():
成熟可靠,支持各种数据类型(推荐实际开发使用)。
示例: const deepCopy = _.cloneDeep(original);
总结
- 浅拷贝适合无嵌套的简单数据,实现简单(扩展运算符、slice等)。
- 深拷贝适合有嵌套引用类型的数据,复杂场景推荐用 Lodash 的 _.cloneDeep ,简单场景可临时用 JSON.parse(JSON.stringify()) (注意其局限性)。