浅谈copy

    作为一个程序猿,相信对于拷贝这个知识点不会陌生,面试的时候面试官应该也可能会问到这个问题吧,写这个也是为了方便以后回顾。

    1.浅拷贝

    概念:浅拷贝仅仅复制了对象的引用,而不是对象本身。

    方法一:直接上

    function simpleClone(initalObj) {

        var obj = {};

        for ( var i in initalObj) {

            obj[i] = initalObj[i];

        }

        return obj;

    }

    方法二:Object.assign()

    2.深拷贝

    概念:把复制的对象所引用的全部对象都深拷贝一遍。

    方法一:JSON.parse()方法。

    function deepClone(initalObj) {

        var obj = {};

        try {

            obj = JSON.parse(JSON.stringify(initalObj));

        }

        return obj;

    }

注意:

one  varjsonStr1 = '{sex:"男",info:"我是好人"}';

two  varjsonStr2 = "{'sex':'男','info':'我是好人'}";

three  varjsonStr3 = '{"sex":"男","info":"我是好人"}';

只有第三种情况才能使用JSON.parse,另外注意一下eval这个函数,如果jsonString是可执行的一段代码,那eval则会直接执行这句代码,故能不用就不用。

方法二:递归拷贝

    function deepClone(initalObj, finalObj={}) {

        var obj = finalObj;

        for (var i in initalObj) {

            var prop = initalObj[i];        

            // 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况

            if(prop === obj) {

            continue;

            }

            if (typeof prop === 'object') {

                obj[i] = (prop.constructor === Array) ? [] : {};

                arguments.callee(prop, obj[i]);

            } else {

                obj[i] = prop;

            }

        }

        return obj;

    }

注意:这里用到了arguments.callee,arguments.callee等同于调用自己,这样写,相当于不管自己函数名是什么,都会调用这个函数。但是,arguments在现在的浏览器中是建议少使用,arguments会影响性能。故,请择优使用。



另附:

function clone(obj) {

    var o;

    if(typeof obj =="object") {

        if(obj ===null) {

        o =null;

    }else{

        if(objinstanceofArray) {

            o = [];

            for(vari =0,len = obj.length;i < len;i++) {

            o.push(clone(obj[i]));

        }    

        }else{

            o = {};    

            for(varjinobj) {

                o[j] =clone(obj[j]);

            }

        }    

    }    

}else{

    o = obj;

}

return o;

}


再附:jquery的extend()     http://link.funteas.com/?target=https%3A%2F%2Fgithub.com%2Fjquery%2Fjquery%2Fblob%2Fmaster%2Fsrc%2Fcore.js

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 相关知识点 数据类型、运算、对象、function、继承、闭包、作用域、原型链、事件、RegExp、JSON、Aj...
    sandisen阅读 11,396评论 7 175
  • body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoot...
    wangyw阅读 596评论 0 0
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,110评论 1 10
  • 如何控制alert中的换行?\n alert(“p\np”); 请编写一个JavaScript函数 parseQu...
    heyunqiang99阅读 1,103评论 0 6
  • 北京的冬 风很硬 霾很重 我拖着行李影子淹没在地铁站人潮中 忘了这是离家的第几次黄昏 回忆像镜头在脑海中翻滚 往回...
    0a525590aef9阅读 128评论 0 0