在實際開發中遇到過太屢次深拷貝淺拷貝的問題。總結一下~javascript
JS數據存儲和深淺拷貝實際運用①html
這是以前寫過的一篇文章,解決淺拷貝深拷貝的問題只說了一種方法,今天來補充一下。java
介紹深拷貝和淺拷貝都在上一篇文章裏介紹過了,在上一篇文章裏只寫了一個針對於數組的一種深拷貝,今天總結一下 js中對象和數組的深淺拷貝。具體的場景已經在上一篇文章裏說明了。jquery
這裏廢話一下上一篇文章中出現的問題:一個表格數據,能夠點擊編輯彈出表單數據,修改數據後點擊取消或者關閉表單時,表格的數據會變空,解決的思路就是當我點擊表單顯示的時候,定義一箇中間變量存儲當前表單的數據。點擊取消按鈕或者關閉表單時,把以前定義的這個中間變量從新賦值給當前的表單數據。就能夠解決啦~
固然這個問題仍是因爲對象或者數組的深淺拷貝的問題。因此今天來總結一下對象和數組的深拷貝和淺拷貝的經常使用方法。es6
首先來介紹一下對象的淺拷貝json
1.最傳統的淺拷貝數組
var gogo = { name: '小明', } var out = {} out = gogo console.log(gogo) //{name: "小明"} console.log(out) //{name: "小明"} out.name = '小花花' console.log(gogo) //{name: "小花花"} console.log(out) //{name: "小花花"}
當我改變out的值的時候gogo裏也改變了~
2.Object.assign()
這個方法是es6的新方法,用於對象的合併,將源對象(source)的全部可枚舉屬性,複製到目標對象(target)。目標對象就是Object.assign(),括號裏的第一個參數。spa
注意,Object.assign能夠用來處理數組,可是會把數組視爲對象。htm
說完了對象的淺拷貝說一下深拷貝
1.轉換成json再轉換成對象實現對象的徹底深拷貝(此方法適用於數組的深拷貝,也是比較簡單快速的深拷貝方法)對象
var out= { name: '小花花', sex: 'man', old: '18' } var gogo= JSON.parse(JSON.stringify(out))
這種方式目前是最受推崇的徹底深拷貝寫法。
可是這樣容易形成數據丟失,由於若是對象中含有Date, function, undefined, Infinity, RegExp, Map, Set, Blob, FileList, ImageData, sparse Array, Typed Array等複雜對象的話,轉化成json再轉回來後這些數據都丟失了。。。
2.擴展運算符
var out= { name: '小花花', sex: 'man', old: '18' } var { ...gogo} = out console.log(gogo) //{name: "小花花", sex: "man", old: "18"} console.log(out) //{name: "小花花", sex: "man", old: "18"} out.name = '大花花花花花' console.log(gogo) //{name: "小花花", sex: "man", old: "18"} console.log(out) // { name: "大花花花花花", sex: "man", old: "18" }
介紹完對象的深淺拷貝以後接下來講一下數組
var array1 = ['a',1,true,{name:'lei',age:18}]; //concat() slice() 實現淺拷貝 var array2 = array1.concat() //修改拷貝後的數據 array2[0] = 'b'; //array1[0]是原始數據類型 因此是直接賦值的 array2[3].name = 'zhang'; //array1[3]是對象數據類型 因此拷貝的是對象的引用,其實仍是和原數組使用同一對象 console.log(array1); // ['a',1,true,{name:'zhang',age:18}]
2.遞歸(目前有點難度因此之後再補充) 深拷貝
3.針對於多維數組的jq方法 深拷貝
jQuery.extend()