淺拷貝:只拷貝物件的基礎屬性值,對屬性值為物件或陣列的屬性則拷貝指標。
深拷貝:拷貝物件的所有屬性作為乙個全新的物件。拷貝前後的物件互不影響。
淺拷貝僅僅是指向被複製的記憶體位址,如果原位址中物件被改變了,那麼
深拷貝出來的物件也會相應改變。
一、物件引用
物件引用容易理解,直接賦值,修改複製後的陣列,原物件會隨之改變。
//物件引用
var boy =
var girl = boy;
console.log(boy === girl);//true
girl.age = 20;
console.log(boy.age);//20
二、淺拷貝
使用object.assign()方法用於將所有可列舉屬性的值從乙個或多個源物件複製到目標物件。它將返回目標物件。
//淺拷貝
var boy =
var girl = object.assign({}, boy);
console.log(boy === girl);//false
girl.age = 20;
console.log(boy.age);//18
var boy =
}var girl = object.assign({}, boy);
console.log(boy === girl);//false
girl.address.home = '上海';
console.log(boy.address.home);//上海
理解:上述**將原始物件拷貝到乙個空物件,就得到原始物件的轉殖。因為object.assign()只是淺拷貝girl.address是對棧物件的引用,因此內層物件的修改會影響原始物件。
三、深拷貝
1、json.parse()與json.stringify()深拷貝
可以通過json物件的方法,來進行物件的深拷貝,**如下:
//純資料json物件的深度轉殖
function deepclone(obj)
理解:通過物件符串化和字串物件化進行物件的拷貝。此方法只使用與純json物件的深拷貝
2、物件遍歷
//包含其他負責的內容 date物件 null undefined
var obj1=,
birthday:new date(),
father:null,
mother:undefined,
school:[,]
} function clone(obj)
} return newobj;
}; console.log(obj1);
console.log(clone(obj1));
理解:
(1)、用 new obj.constructor ()
建構函式新建乙個空的物件,
可以保持原形鏈的繼承;
(2)、用obj.hasownproperty(key)
來判斷屬性是否來自原型鏈上,因為for..in..
也會遍歷其原型鏈上的可列舉屬性。
(3)、函式用到遞迴演算法,在函式有名字,而且名字以後也不會變的情況下,這樣定義沒有問題。但問題是這個函式的執行與函式名 factorial 緊緊耦合在了一起。為了消除這種緊密耦合的現象,需要使用 arguments.callee
。參考:
js物件淺拷貝和深拷貝
1 淺拷貝 varobj 定義乙個物件 functioncopy obj 定義乙個空物件,用來儲存key和value for varkeyinobj returnnewobj 將新物件作為返回值,返回到外面 varobj2 copy obj 將obj複製給obj2 obj2.a 20 改變obj2中...
js物件的深拷貝和淺拷貝
淺拷貝 只是複製指向某個物件的指標,而不複製物件本身新舊物件,它們還是共享同一記憶體。深拷貝 會另選創造乙個一模一樣的物件,新物件和原物件不共享記憶體,修改新物件不會改到原物件。也就是老死不相往來了。知道了深淺拷貝的含義,那就來總結如何實現深淺拷貝。let data 第一種情況 let obj da...
js 物件深拷貝 深拷貝與淺拷貝
前言 最近在複習一些面試的知識點,剛剛好複習到了這一部分,於是就寫下這篇文章記錄一下。一 值型別和引用型別 在學習深拷貝和淺拷貝之前,我們先來了解一下js的變數型別。值型別 vs 引用型別 值型別 值型別主要有 number,string,boolean,symbol,null,undefined ...