PS:本文整理的爲部分對象的淺拷貝與深拷貝(與基本數據類型的概念不同。eg:就淺拷貝來講,若是屬性是基本類型,拷貝的就是基本類型的值,若是屬性是引用類型,拷貝的就是內存地址 ,因此若是其中一個對象改變了這個地址,就會影響到另外一個對象。)javascript
方法用於將全部可枚舉屬性的值從一個或多個源對象複製到目標對象。它將返回目標對象。若是目標對象中的屬性具備相同的鍵,則屬性將被源對象中的屬性覆蓋。後面的源對象的屬性將相似地覆蓋前面的源對象的屬性。
語法:Object.assign(target, ...sources)
target:目標對象
sources: 源對象
返回值: 目標對象
Object.assign 方法只會拷貝源對象自身的而且可枚舉的屬性到目標對象(淺拷貝)。該方法使用源對象的[[Get]]和目標對象的[[Set]],因此它會調用相關 getter 和 setter。所以,它分配屬性,而不單單是複製或定義新的屬性。若是合併源包含getter,這可能使其不適合將新屬性合併到原型中。爲了將屬性定義(包括其可枚舉性)複製到原型,應使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。
String類型和 Symbol 類型的屬性都會被拷貝。
在出現錯誤的狀況下,例如,若是屬性不可寫,會引起TypeError,若是在引起錯誤以前添加了任何屬性,則能夠更改target對象。
注意,Object.assign 不會在那些source對象值爲 null 或 undefined 的時候拋出錯誤。
css
概念:根據不包含引用對象的普通數組深拷貝獲得啓發,不拷貝引用對象,拷貝一個字符串會新闢一個新的存儲地址,這樣就切斷了引用對象的指針聯繫。html
var test={ a:"ss", b:"dd", c:[ {dd:"css",ee:"cdd"}, {mm:"ff",nn:"ee"} ] }; var test1 = JSON.parse(JSON.stringify(test));//拷貝數組,注意這行的拷貝方法 console.log(test); console.log(test1); test1.c[0].dd="change"; //改變test1的c屬性對象的d屬性 console.log(test); //不影響test console.log(test1);
根據測試結果,test1已經從test複製一份,而且test1改變其中屬性的值時,對原來的對象test沒有形成影響。java
能夠經過爲IE7以及IE7如下版本的IE瀏覽器引入json2.js,使用json2.js來解決JSON的兼容性問題git
<!--[if lt IE 7]> <script src="具體放路徑/json2.js"></script> <![endif]-->
json2.js的github地址爲:https://github.com/douglascrockford/JSON-jsgithub
JSON.stringify()的做用是將 JavaScript 對象轉換爲 JSON 字符串, JSON.parse()能夠將JSON字符串轉爲一個對象。
PS:本文所介紹的對象的深拷貝與淺拷貝並不完整,以後若有新內容會更新整理。json