JavaScript之深拷贝和浅拷贝的分析

  可以参考知乎:https://www.zhihu.com/question/23031215

  基本总结如下:深拷贝主要针对的是对象以及数组这两种复杂的对象。

  

    /**
     * 扩展对象,增加属性和方法
     * @私有
     * @参数 {Boolean}  deep     If true, do a deep (or recursive) merge [optional] 深拷贝还是浅拷贝
     * @参数 {Object}   objects  The objects to merge together
     * @返回 {Object}          Merged values of defaults and options
     */
    var extend = function () {

        // 变量
        var extended = {};
        var deep = false;
        var i = 0;
        var length = arguments.length;

        // Check if a deep merge
        if ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) {
            deep = arguments[0];
            i++;
        }

        // Merge the object into the extended object
        var merge = function (obj) {
            for ( var prop in obj ) {
                if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) {
                    // If deep merge and property is an object, merge properties
                    // 这里并没有考虑对数组的深拷贝 至于方法这个对象按正常的方式考虑即可。
                    if ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) {
                        // 考虑到extended[prop] 本身不为空,如此合并需要考虑之前的内容。【细节啊!!!】
                        extended[prop] = extend( true, extended[prop], obj[prop] );
                    } else {
                        extended[prop] = obj[prop];
                    }
                }
            }
        };

        // Loop through each object and conduct a merge
        for ( ; i < length; i++ ) {
            var obj = arguments[i];
            merge(obj);
        }

        return extended;

    };

可以着手这个函数学习研究一下

posted @ 2017-04-12 14:34  小路orz  阅读(142)  评论(0编辑  收藏  举报