js 淺拷貝有大用
如題
像淺拷貝、深拷貝這類的知識點我們應該都明白是怎麼回事,大部分都是在面試的時候會被問到。大多讓你實現一個深拷貝。現實中我們都用比較暴力直接的手段 JSON stringify.
一句話就搞定,管他效能不效能的。不過寫了這麼多程式碼,深拷貝用的確實不怎麼多。反而淺拷貝用的比較多,尤其是 Object.assign 被大量使用。
當然我並不是想分享他的實現遠離。而是想說下我突然感覺到淺拷貝有個亮點。
不知道大家有沒有聽過,共享結構這個詞。
意思是一個新的物件的結構和舊物件的結構一至,是從原始物件直接複製過來的。當然不是說直接負值的,而是使用上面的Object.assign 實現的。
其結果是產生一個新物件。
淺拷貝的作用在於對於簡單型別可以直接複製其值,對於複雜型別 複製的是一個物件具柄,也就是兩個物件指向的是同一塊記憶體區域。
好了,通過這種方式產生的兩物件,有什麼用呢? 我們可以很方便的檢測到 新舊兩個物件的差異,也就是哪個key的值不同,可以通過一層便利就可以對比出來。
這個時候可以腦補下畫面,宣告一個物件 aaa,裡面包含 兩個key ,一個是title 表示標題,一個是list 表示列表 一個數組 【1,2,3】,然後使用Object.assign,進行淺拷貝一個新物件。
新物件和原物件做比較 即便是兩個物件的內容沒有做任何改變,但是兩物件是完全不等的。因為是生成了一個新物件。但是當我們比較下兩個物件的list的時候,是完全相等的。
第二部。再使用 Object.assign 對願物件進行生成一個新物件,這個時候 我們增加第三個引數,是一個物件 ,key 是list 【1,2】。
好,得到結果 比較兩個物件的list,是完全不等的。因為指向了不同的飲用地址。不知道我們上面這麼描述是否清洗,大家腦補的怎樣了。
腦補成功了嗎,是不是覺得這個特性很6,那麼我們自己就可以寫一個獲取新舊物件的差異方法了。返回差異的key的列表。是吧?
另外說下 腦補,
學技術腦補還是很重要的。沒有電腦的時候就要靠腦子進行預演。
應用場景
那這個特性的應用場景有哪些呢?這個我也說不好,大家可以自己想下自己曾做過的專案。 我這裡能想到的場景有2個
1. 比如我們要一個小程式的查詢列表頁面,這個頁面包含很多的條件。有的在當前頁面,有的需要跳轉頁面設定條件,這個時候就需要在回到頁面後進行判斷條件是否有變化,有變化就重新請求資料渲染頁面。
2. 我想到了redux裡的reducer這個純函式,reducer獲得state和action兩個物件,不管state有無變化都會返回一個新物件。這裡使用的就是這個特性。
共享結構實現的方法
1.上面說的 object.assgin
2. 擴充套件運算子
3. 如果大家知道的話可以告訴哈
總結下:
本節就是介紹了下淺拷貝的妙用,以及提到的一個名字 “共享結構”,以及他的使用場景。當然這種主要是對簡單物件,層級也就2層把。層級太多的話複雜度就增加了。具體是否能適用就看具體的場景了。
家裡電腦卡,錯別字較多,還有程式碼回頭補上。
以上也可以在 喜馬拉雅 上 訂閱 “大前端開發解惑” 進行收聽