zoukankan      html  css  js  c++  java
  • 关于JS 的深拷贝和浅拷贝

    最简单的深拷贝当然是var obj1 = JSON.parse(JSON.stringify(obj2));

    但这种拷贝有两个缺点:

    • 如果你的对象里有函数,函数无法被拷贝下来

    • 无法拷贝copyObj对象原型链上的属性和方法

    真正的深拷贝:

    function deepCopy(source, target = {}) {
            var key;
            for (key in source) {
                if (source.hasOwnProperty(key)) {                         // 意思就是__proto__上面的属性,我不拷贝
                    if (typeof(source[key]) === "object") {               // 如果这一项是object类型,就递归调用deepCopy
                        target[key] = Array.isArray(source[key]) ? [] : {};
                        deepCopy(source[key], target[key]);
                    } else {                                            // 如果不是object类型,就直接赋值拷贝
                        target[key] = source[key];
                    }
                }
            }
            return target;
        }
    

      source.hasOwnProperty(key),意思是判断这一项是否是其自有属性,是的话才拷贝,不是就不拷贝。也就是说__proto__上面的属性,我不拷贝。这个其实你可以根据业务需求,来决定加上和这个条件;

    上面的deepCopy方法有漏洞,没有考虑source一开始就是数组的情

    下面是一个修改后版本:

    function deepCopy( source ) {
        let target = Array.isArray( source ) ? [] : {}
        for ( var k in source ) {
            if ( typeof source[ k ] === 'object' ) {
                target[ k ] = deepCopy( source[ k ] )
            } else {
                target[ k ] = source[ k ]
            }
        }
        return target
    }
    

      

  • 相关阅读:
    二项堆(三)之 Java的实现
    二项堆(二)之 C++的实现
    二项堆(一)之 图文解析 和 C语言的实现
    斜堆(三)之 Java的实现
    斜堆(二)之 C++的实现
    斜堆(一)之 C语言的实现
    左倾堆(三)之 Java的实现
    左倾堆(二)之 C++的实现
    左倾堆(一)之 图文解析 和 C语言的实现
    二叉堆(三)之 Java的实现
  • 原文地址:https://www.cnblogs.com/paradise-of-sunshine/p/10137409.html
Copyright © 2011-2022 走看看