Object.assign()的痛點
最近也一直會用javascript,然後中間使用的一些元件,如Echarts 會有非常複雜的配置檔案,而大部分配置可能都是一樣的,所以想著寫一份通用配置,然後,其他地方需要使用的時候,用這份配置深複製一份配置,然後在上面繼續改。就如下:
深複製和淺複製
這裡也涉及到一個深複製和淺複製的概念。javascript中儲存物件都是存地址的,所以淺複製是都指向同一塊記憶體區塊,而深複製則是另外開闢了一塊區域。下面例項也可以看出這一點:
可以明顯看出,淺複製在改變其中一個值時,會導致其他也一起改變,而深複製不會。
Object.assign()
我需要的是深複製的方法,然後發現原來es6 中有Object.assign() 這個方法,感覺可以拿來用了。
貼一下兩個官方例子:
//1.
是不是很完美,又可以clone又可以merge。在我這種情況下,我覺得我的程式碼量又可以減少了,比如:
不過,很快,問題出現了,那就是
merge和我想象的不一樣
原本想的是它只會覆蓋subtext ,然而其實它直接覆蓋了整個title ,這個讓我比較鬱悶,相當於它只merge根屬性,下面的就不做處理了。
程式碼只能重構成相對麻煩一點的:
這樣用雖然麻煩一點,但是也還好,可以用了。不過。。。很快,又出現問題了,如下:
上面結果發現兩個配置變得一模一樣,而其實我們並沒有去更改opt1 的subtext ,只是改了opt2 的。
這說明一點:在title 這一層只是簡單的淺複製 ,而沒有繼續深入的深複製。
這裡不經讓我懷疑這個介面到底是怎麼實現的,它到底是不是和我所想的一樣。
翻了一下官方文件,發現它寫得一個Polyfill ,程式碼我加了點註釋如下:
上面的程式碼可以直接說明它只對頂層屬性做了賦值,完全沒有繼續做遞迴之類的把所有下一層的屬性做深複製。
總結
Object.assign()
只是一級屬性複製,比淺複製多深複製了一層而已。用的時候,還是要注意這個問題的。
附
發現一個可以簡單實現深複製的方法,當然,有一定限制,如下:
const obj1 = JSON.parse(JSON.stringify(obj));
思路就是將一個物件轉成json字串,然後又將字串轉回物件。
轉載至:http://blog.csdn.net/waiterwaiter/article/details/50267787
作者:飢人谷_米彌輪
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1916/viewspace-2813664/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺析Web components的痛點Web
- object.assignObject
- 後期資料庫主從架構的痛點,真的痛資料庫架構
- Object.assign()方法Object
- 什麼是客戶的痛點?CRM系統如何解決痛點的四大流程
- 物聯網安全痛點
- 2017 年 Linux 的五大痛點Linux
- CRM系統的痛點,如何解決?
- 運維開發的痛點和思考運維
- 軟體測試的痛點有哪些?
- AIGC 真的解決了我的痛點AIGC
- Object.assign 模組Object
- 專案國際化的難點痛點是什麼
- ERP實施人員的業務痛點
- 關於我在學習Swoole的痛點
- 華為雲助力工業網際網路:從痛點中來,到痛點中去
- 軟體測試過程中的痛點思考
- SuperCell新作《Rush Wars》擊中了COC的哪些痛點?
- 車路協同若干痛點問題的思考
- 跨境供應鏈系統的模式與痛點模式
- 使用者痛點淺析(上)
- 財務痛點,RPA來擊破
- 痛!痛!痛!我們的好兄弟Git,一路走好!Git
- JS: Object.assign() Vs Spread OperatorJSObject
- SAP BTP MTA 應用解決的架構痛點架構
- Zoho Workplace解決遠端辦公中的痛點
- mysql 的這個痛點,用 elasticsearch 輕鬆解決MySqlElasticsearch
- 模切工廠的管理痛點,點晴模切ERP來解決!
- 跨境供應鏈系統痛點分析
- ES6 的Object.assign(target, source_1, ···)Object
- JWT技術解決IM系統的認證痛點JWT
- [譯] React Native 中那些令我收穫頗豐的痛點React Native
- 解決 App 自動化測試的常見痛點APP
- 聊聊公眾號最讓我不爽的兩個痛點
- 6個問題解決產品銷量的痛點
- 國產化浪潮下TiDB解決的痛點問題TiDB
- 流量治理最大的痛點-資源利用率上不去
- 企業採購管理的這些痛點,如何解決?