muz-doraemon
Version:
自主开发的UniApp组件——Жидзин(Zidjin)系列组件库。
25 lines (20 loc) • 1.26 kB
JavaScript
function deepClone(target, hash = new WeakMap()) {
// 额外开辟一个存储空间WeakMap来存储当前对象
if (target === null) return target; // 如果是 null 就不进行拷贝操作
if (target instanceof Date) return new Date(target); // 处理日期
if (target instanceof RegExp) return new RegExp(target); // 处理正则
// #ifdef H5
if (target instanceof HTMLElement) return target; // 处理 DOM元素
// #endif
if (typeof target !== 'object') return target; // 处理原始类型和函数 不需要深拷贝,直接返回
// 是引用类型的话就要进行深拷贝
if (hash.get(target)) return hash.get(target); // 当需要拷贝当前对象时,先去存储空间中找,如果有的话直接返回
const cloneTarget = new target.constructor(); // 创建一个新的克隆对象或克隆数组
hash.set(target, cloneTarget); // 如果存储空间中没有就存进 hash 里
Reflect.ownKeys(target).forEach(key => {
// 引入 Reflect.ownKeys,处理 Symbol 作为键名的情况
cloneTarget[key] = deepClone(target[key], hash); // 递归拷贝每一层
});
return cloneTarget; // 返回克隆的对象
}
export default deepClone;