浅谈copy

作者: weberZhou | 来源:发表于2017-11-08 14:36 被阅读0次

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

    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

相关文章

  • 浅谈copy

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

  • iOS之——关键词strong、weak、assign、copy

    浅谈——名词strong、weak、assign、copy,并比较不同 strong 表示指向并拥有该对象。其修饰...

  • 深拷贝和浅拷贝

    1: iOS开发 深拷贝与浅拷贝 2: iOS 浅谈:深.浅拷贝与copy.strong 3: iOS开发——深...

  • 浅谈iOS Copy与MutableCopy

    写了这么久的iOS,copy与mutableCopy也用了不少,可究竟什么时候用copy,什么时候用mutable...

  • iOS 浅谈model 深浅copy

    在我们开发中常常会遇到这样的情况,当前是列表页面 ,点击后进详情页面,会把列表页面的model传到详情页面,如图:...

  • iOS 深拷贝与浅拷贝

    本文参考 iOS浅谈:深.浅拷贝与copy.strong这一篇总结的不太到位,可以继续读下一篇 在iOS中关于深拷...

  • iOS 浅谈Strong、Copy 和 mutableCopy

    在iOS的王国里,Strong、Copy和mutableCopy在我们的使用过程中,缺一不可的。接下来来介绍一下它...

  • -119| python篇 |浅谈拷贝 copy()

    说到copy(), 很自然就要谈到深拷贝 deepcopy() 和 浅拷贝 copy() 深拷贝:拷贝值 和 重新...

  • Copy Copy Copy

    说到Copy 大多会想到浅复制(指针复制),深复制(内容复制)。看一张图: 你会发现对于集合类型,深复制那写的是...

  • 2018-09-27

    copy的问题 copy.copy返回浅copy copy.deepcopy返回深copy 1fromcopyim...

网友评论

    本文标题:浅谈copy

    本文链接:https://www.haomeiwen.com/subject/zhyemxtx.html