JavaScript之深度克隆、多种实现方式、列举各种方式的优缺点、对象自有属性、拷贝、复制


源数据

class Test {
    constructor() {
        this.a = 1;
        this.b = 2;
    }

    c() {
        console.log('c');
    }
};

Test.prototype.d = 1;
const obj = new Test();
obj.h = obj;

正统深克隆

// 循环引用的克隆
// 防止递归的无限执行
// 避免报错
// 避免内存泄漏
const cache = new WeakMap();

function orthDeepClone(value) {
    // 函数不需要克隆
    // 会进入此判断并直接返回
    if (typeof value !== 'object' || value === null) return value;
    // 判断缓存是否存在当前值
    // 有的话返回结果
    // 没有就继续往下执行
    if (cache.has(value)) return cache.get(value);

    // 创建数组或对象
    // 可以添加Map等其他对象
    const result = Array.isArray(value) ? [] : {};

    // 设置result的原型为value的原型
    // 如果不设置
    // 当克隆类的时候返回的是普通对象
    Object.setPrototypeOf(result, Object.getPrototypeOf(value));
    // 设置缓存
    cache.set(value, result);
    for (const key in obj) {
        // 不确定数据类型时使用
        // if (Object.hasOwnProperty.call(obj, key)) result[key] = orthDeepClone(obj[key]);

        // 确定数据类型时使用
        // 只克隆value的自有属性
        // 原型上的属性不参与克隆
        if (value.hasOwnProperty(key)) result[key] = orthDeepClone(obj[key]);
    }

    return result;
}

console.log(orthDeepClone(obj));
// Test {a: 1, b: 2, h: Test}

JSON深克隆

function JSONDeepClone(value) {
    return JSON.parse(JSON.stringify(value));
}

console.log(JSONDeepClone(obj));
// 报错
// Uncaught TypeError: Converting circular structure to JSON

JavaScript中,对象和数组是引用类型,当将一个对象或数组赋值给另一个变量时,它们实际上是共享同一块内存空间。这意味着对一个对象或数组的修改会影响到所有引用它的变量。
为了创建一个独立的副本,可以使用深克隆。JSON.stringify()方法将JavaScript对象转换为一个JSON字符串,然后使用 JSON.parse()方法将该字符串解析为一个新的JavaScript对象。通过这种方式,创建了一个完全独立的副本,对其中一个对象的修改不会影响到另一个对象。
需要注意的是,这种方法仅适用于可以被JSON表示的数据类型,例如对象数组字符串数字布尔值null。它不能复制函数正则表达式Date对象等特殊类型的值。

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值