淺拷貝和深拷貝都是只針對Object,Array這樣的復(fù)雜對象。淺拷貝只復(fù)制一層對象的屬性,而深拷貝則是遞歸復(fù)制了所有層級。
淺拷貝的實(shí)現(xiàn):
var obj = { a: 1, arr: [2, 3]};
var shallowObj = shallowCopy(obj);
function shallowCopy(obj){
??? var dist = {};
??? for(var prop in obj){
??????? if(obj.hasOwnProperty(prop)){
? ? ? ? ? ? dist[prop] = obj[prop];
??????? }
??? }
??? return dist;
}
由于js存儲對象都是存儲地址,所以淺拷貝會(huì)導(dǎo)致復(fù)制出的新對象和原對象指向同一塊內(nèi)存地址。若改變一個(gè)值,會(huì)導(dǎo)致另一個(gè)對象同時(shí)變化。
深拷貝則不同,不僅將原對象的各個(gè)屬性逐個(gè)復(fù)制出去,而且將原對象各個(gè)屬性包含的對象也以遞歸方式依次復(fù)制到新對象中,重新開辟一個(gè)空間存儲新對象。
深拷貝的實(shí)現(xiàn):
function deepClone(obj){
??? var newObj = obj.constructor === Array ? [] : {}
??? if(typeof obj !== 'Object'){
??????? return
??? }else if( window.JSON){
??????? newObj = JSON.parse(JSON.stringify(obj));
??? } else {
??????? for (var i in obj){
??????????? newObj[i] = typeof obj[i] === 'Object' ? deepClone(obj[i]) : obj[i];
??????? }
??? }
??? return newObj;
}
另外,jq也提供了拷貝的方法——extend
JQuery.extend(true,obj);
第一個(gè)參數(shù)是布爾值,用來設(shè)置是否進(jìn)行深拷貝。
還有一種可以實(shí)現(xiàn)深拷貝:JSON.parse(JSON.stringify(obj))。