function
clone
(obj)
return buf;
} else
if (obj instanceof
object); // 建立乙個空物件
for (var k in obj)
return buf;
}else
}//測試
function
o()
function
x()
x.prototype = new o();
x = new x();
var obj = , b : 'b',x:x};
var obj2 = clone(obj);
obj.x.yyy = 'zzz'
console.log(obj2);
console.log(obj2.x.yyy);
以上對嗎,物件x具有原型上的屬性,通過函式clone也深拷貝了原型上的屬性;測試可知
改變物件obj上的原型屬性,obj2不變。
obj.x.yyy = 'zzz'
$ = function
() var key;
for (key in obj)
return key === undefined || hasown.call(obj, key);
},extend = function
(deep, target, options) //為了避免無限迴圈
if (deep && copy
&& (isplainobject(copy) || (copyisarray = array.isarray(copy)))) else ;
}target[name] = extend(deep, clone, copy);
} else
if (copy !== undefined)
}return target;
};return ;
}();
obj1 = ;
obj2 = , y : 'y' };
var combineobj = $.extend(true,obj1,obj2);
console.log(combineobj);
注意:(1)關鍵**是
isplainobject = function
(obj)
var key;
for (key in obj)
return key === undefined || hasown.call(obj, key);
},
(2)把遞迴的寫法搞清楚
//判斷是物件
var isobject = function
(obj)
//判斷是陣列
var isarray = array.isarray || function
(obj)
//獲取物件不在原型上的鍵
var get_keys = function
(obj)
}return keys;
}//實現深拷貝
var deepcopy = function
(obj)else
}}else
if(isobject(obj));
var keys = get_keys(obj);
var length = keys.length ;
for(var i = 0 ; i < length ; i++)
}else
return temp ;
}
注意:(1)主要是hasownproperty的用法:該方法可以檢測乙個屬性是存在於例項中,還是存在於原型中。這個方法只有在只在給定屬性存在於物件例項中時,才會返回true。
(2)第2種和第3種的區別:第2種是只要物件的建構函式不是object,則不進行深拷貝,而第3種是物件的建構函式可以是非object,不深拷貝物件原型上的屬性,只拷貝例項上的屬性。
舉例如下:
function o()
function x()
x.prototype = new o();
x = new x();
//var obj = , b : 'b',x:x };
var obj = , b : 'b',x:x};
var obj2 = deepcopy(obj);
obj.x.*** = 'zzz'
obj.x.yyy = 'zzz'
console.log("obj ",obj); //, b: 'b', x: o }
console.log("obj2 ",obj2); //, b: 'b', x: }
console.log(obj2.x.***); //*** 已經深拷貝,值不變
console.log(obj2.x.yyy); //
undefined
console.log(x.hasownproperty("***"));//
true
(3)deepcopy函式是直接不拷貝(跳過)相關物件,而$.extend對於不滿足isplainobject
的物件,則執行淺拷貝(即target[name] = copy;
)。
$ = function
() ,
//對type的注釋:如果obj=null,則返回string(obj),即null,
type = function
(obj) ,
iswindow = function
(obj) ,
//如果瀏覽器有內建的array.isarray 實現,就使用瀏覽器自身的實現方式,否則將物件轉為string,看是否為"[object array]"。(1.這裡所說的將物件轉為string即tostring.call(obj) 2.考慮了相容性 )
isarray = array.isarray || function
(obj) ,
isplainobject = function
(obj)
if (obj.constructor && !hasown.call(obj, "constructor")
&& !hasown.call(obj.constructor.prototype, "isprototypeof"))
var key;
for (key in obj)
return key === undefined || hasown.call(obj, key);
},extend = function
(deep, target, options) //為了避免無限迴圈
//以下if將copy是物件和陣列合併在一起
if (deep && copy
&& (isplainobject(copy) || (copyisarray = isarray(copy)))) else ;
}target[name] = extend(deep, clone, copy);
} else
if (copy !== undefined)
}return target;
};return ;
}();
//測試
function
o()
function
x()
x.prototype = new o();
x = new x();
obj1 = ;
obj2 = , y : 'y' };
var combineobj = $.extend(true,obj1,obj2);
console.log(combineobj);
python面試題 深拷貝與淺拷貝
1.賦值拷貝 2.copy淺拷貝 3.deepcopy深拷貝 import copya 1,2,3,4 賦值拷貝,預設淺拷貝,傳遞物件的引用而已,原始列表改變,被賦值的b也會做相同的改變 b a5 print a,adress id a 1,2,3,4 5 adress 2670537167752 ...
208面試題 物件拷貝
61.為什麼要使用轉殖?想對乙個物件進行處理,又想保留原有的資料進行接下來的操作,就需要轉殖了。轉殖分淺轉殖和深轉殖,淺轉殖後的物件中非基本物件和原物件指向同一塊記憶體,因此對這些非基本物件的修改會同時更改轉殖前後的物件。深轉殖可以實現完全的轉殖,可以用反射的方式或序列化的方式實現。62.如何實現物...
面試題 String類的淺拷貝 深拷貝 寫時拷貝
string的拷貝是面試中的經常會被問到的問題,所以,學懂string類是非常重要的。下面我們先來看一段 class string else string const string s 拷貝建構函式,相當於系統預設合成 pstr s.pstr string operator const string...