? ? 作為一個程序猿,相信對于拷貝這個知識點不會陌生,面試的時候面試官應(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