zoukankan      html  css  js  c++  java
  • 手写一个深拷贝

    深拷贝

    说到深拷贝,肯定想到的最简单的方式就 JSON.stringify 和 JSON.parse 配合,这个是最简单的深拷贝方式

    手写一个深拷贝

    深拷贝 = 浅拷贝 + 递归 ,这个只是最笨的一种方式

    var a = {
        name: "muyiy",
        book: {
            title: "You Don't Know JS",
            price: "45"
        },
        a1: undefined,
        a2: null,
        a3: 123
    }
    // hasOwnProperty表示是否有自己的属性。这个方法会查找一个对象是否有某个属性,但是不会去查找它的原型链。
    function cloneDeep1(source) {
        var target = {};
        for (var key in source) {
            if (source.hasOwnProperty(key)) {
                if (typeof source[key] === 'object') {
                    target[key] = cloneDeep1(source[key]); // 注意这里
                } else {
                    target[key] = source[key];
                }
            }
        }
        return target;
    }
    
    // 使用上面测试用例测试一下
    console.log(a)
    var b = cloneDeep1(a);
    a.name = "前端进阶";
    a.book.price = "55";
    console.log(b);
    

    考虑再全一些的深拷贝

    function deepClone(obj,hash = new WeakMap()){ //递归实现
        if(obj instanceof RegExp) return new RegExp(obj);
        if(obj instanceof Date) return new Date(obj);
        if(obj === null || typeof obj != "object"){
            // 普通数据类型
            return obj;
        }
        if(hash.has(obj)){
            return hash.get(obj);
        }
        // 下面是数组和对象的判断
        let t = new obj.constructor();
        hash.set(obj,t);
        for(let key in obj){
            //  递归
            if(obj.hasOwnProperty(key)){ //是否是自身的属性
                t[key] = deepClone(obj[key],hash)
            }
        }
        return t;
    }
    

    当然 递归很容易爆栈,只是别的方法我还尚未全完能够理解出来

  • 相关阅读:
    在eclipse中API的封装和调用
    冒泡排序
    java中阻止类的继承
    java中数组复制的两种方式
    ssh框架搭建出现的异常: class com.my.entity.user not found while looking for property: id
    ssh框架中struts.xml 的配置参数详解
    线程的五种状态
    Sql Server 分页
    window.opener 子窗体操作父窗体
    贪心算法--汽车加油问题
  • 原文地址:https://www.cnblogs.com/sunhang32/p/12517612.html
Copyright © 2011-2022 走看看