淺談copy

? ? 作為一個程序猿,相信對于拷貝這個知識點不會陌生,面試的時候面試官應(yīng)該也可能會問到這個問題吧,寫這個也是為了方便以后回顧。

? ? 1.淺拷貝

? ? 概念:淺拷貝僅僅復(fù)制了對象的引用,而不是對象本身。

? ? 方法一:直接上

????function simpleClone(initalObj) {

????????var obj = {};

????????for ( var i in initalObj) {

????????????obj[i] = initalObj[i];

????????}

????????return obj;

????}

? ? 方法二:Object.assign()

? ? 2.深拷貝

? ? 概念:把復(fù)制的對象所引用的全部對象都深拷貝一遍。

? ? 方法一: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這個函數(shù),如果jsonString是可執(zhí)行的一段代碼,那eval則會直接執(zhí)行這句代碼,故能不用就不用。

方法二:遞歸拷貝

????function deepClone(initalObj, finalObj={}) {

????????var obj = finalObj;

????????for (var i in initalObj) {

????????????var prop = initalObj[i];????????

????????????// 避免相互引用對象導(dǎo)致死循環(huán),如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等同于調(diào)用自己,這樣寫,相當于不管自己函數(shù)名是什么,都會調(diào)用這個函數(shù)。但是,arguments在現(xiàn)在的瀏覽器中是建議少使用,arguments會影響性能。故,請擇優(yōu)使用。



另附:

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容