整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          最好用的深拷貝方法?分享 1 段優質 JS 代碼片段

          最好用的深拷貝方法?分享 1 段優質 JS 代碼片段!

          內容首發于工粽號:程序員大澈,每日分享一段優質代碼片段,歡迎關注和投稿!

          大家好,我是大澈!

          本文約 900+ 字,整篇閱讀約需 1 分鐘。

          今天分享一段優質 JS 代碼片段,輕松實現了對象間的深度克隆。

          老規矩,先閱讀代碼片段并思考,再看代碼解析再思考,最后評論區留下你的見解!

          const a={ x: 1, y: { y1: 'a' }, z: new Set([1, 2]) };
          const b=structuredClone(a); 
          // a !==b, a.y !==b.y, a.z !==b.z


          分享原因

          這段代碼展示了 structuredClone 方法在深度復制對象方面的應用,這對于處理復雜的數據結構非常有用。

          它比 JSON.parse(JSON.stringify()) 方法更安全,能避免一些類型轉換問題,例如:保留日期對象的原有類型,而不是轉換為字符串。

          這個方法相對簡便易用,只需將需要拷貝的對象作為參數傳入即可,項目中推薦去使用!

          代碼解析

          1. const a={ ... };

          這里定義了一個名為 a 的對象,它包含一個基本類型的屬性 x,一個嵌套對象 y ,以及一個 Set 類型的屬性 z 。

          2. structuredClone(a);

          structuredClone() 是 JavaScript 中用于深拷貝對象的方法。

          它使用結構化克隆算法創建給定值的深層拷貝。

          語法是 structuredClone(value, { transfer }) :

          value:被克隆的對象,可以是任何結構化克隆支持的類型。

          transfer(可選參數):是一個可轉移對象的數組,里面的值并沒有被克隆,而是被轉移到被拷貝對象上。

          支持多種類型:可以復制大多數內置值,如數組、普通對象、日期(Date)、正則表達式(RegExp)、集合(Set)、映射(Map)等,還包括一些 Web API 類型,如 AudioData、Blob、CryptoKey 等。

          但它的一些限制也不可忽略:

          不支持拷貝函數,嘗試復制函數會導致 DataCloneError 異常。

          不支持 DOM 節點,復制 DOM 節點也會引發異常。

          不復制屬性描述符、setter 和 getter 等元數據屬性,getter 屬性的值會被復制,但 getter 函數本身不會被復制。

          不遍歷或復制對象原型,克隆后的對象不再屬于原始構造函數的實例,不過其屬性會被復制。

          在 Web Workers 中的支持不完全,具體可查看 MDN 瀏覽器兼容性表。在不支持的平臺上,可以使用 polyfill 來模擬該方法。

          最后,附上兼容性

          . 關于DOM

          文檔對象模型(DocumentObject Model),是基于瀏覽器編程的一套API接口,W3C出臺的推薦標準,每個瀏覽器都有一些細微的差別,其中以Mozilla(火狐)的瀏覽器最與標準接近。

          通過 DOM,可以訪問所有的 HTML元素,連同它們所包含的文本和屬性??梢詫ζ渲械膬热葸M行修改和刪除,同時也可以創建新的元素。


          2. 動態改變文檔內容

          要想對頁面的內容做修改,需要如下方式來操作:

          ? a.解析文檔(如HTML)并生成DOM樹

          ? b.通過DOM提供的屬性和方法,獲取或改變文檔的內容

          2.1 DOM的節點

          HTML 文檔中的每個成分都是一個節點(Node)

          DOM 是這樣規定的:

          • 整個文檔是一個文檔節點
          • 每個 HTML 標簽是一個元素節點
          • 包含在 HTML 元素中的文本是文本節點
          • 每一個 HTML 屬性是一個屬性節點
          • 注釋屬于注釋節點

          2.1.1 節點間的關系

          節點彼此都有等級關系

          父節點、子節點、兄弟節點(同級節點)

          2.2 DOM標準接口

          W3C提供了三類DOM標準接口,如下:

          ? a. 核心DOM,適用于各種結構化文檔

          ? b.HTML DOM,專用于HTML文檔

          c. XML DOM,專用于XML文檔


          3. 核心DOM操作

          3.1 訪問節點

          訪問節點兼容處理

          getElement系列方法

          使用getElement系列方法來訪問指定的節點

          • getElementById():返回對擁有指定id的第一個對象的引用
          • getElementsByTagName():返回帶有指定名稱的對象集合
          • getElementsByClassName():返回指定的類選擇器的集合
          • getElementsByName():返回帶有指定名稱的對象集合(注意不是所有標簽都有name屬性)

          3.1.1 節點信息1

          每個節點都擁有包含節點某些信息的屬性

          • nodeName(節點名稱)
          • nodeValue(節點值)
          • nodeType(節點類型)

          3.1.2 節點信息2

          nodeName

          • 元素節點的 nodeName (節點名稱)是標簽名稱
          • 屬性節點的 nodeName 是屬性名稱
          • 文本節點的 nodeName 永遠是 #text
          • 文檔節點的 nodeName 永遠是 #document

          nodeValue

          • 對于文本節點,nodeValue 屬性包含文本
          • 對于屬性節點,nodeValue 屬性包含屬性值

          nodeType

          • 元素 1 、屬性 2、 文本 3、 注釋 8、 文檔 9
          • 上面不同的數值代表不同的節點類型

          3.2 創建和操作節點

          3.2.1 主要方法

          方法 說 明

          createElement( tagName) 創建一個名為tagName的新元素節點,用法Document.createElement(標簽名)

          ANode.appendChild( BNode) 把子節點B追加到父節點A里面的末尾

          insertBefore( ANode,BNode ) 把A節點插入到B節點之前

          Node.loneNode(deep) deep為true則復制該節點以及該節點的所有子節點,為false則只復制該節點和其屬性


          3.2.2 操作節點的屬性


          3.3 刪除和替換節點

          方法 說 明

          removeChild( node) 刪除指定的節點(用父級元素去調用它)

          replaceChild( newNode, oldNode) 用newNode來替換oldNode(https://www.cnblogs.com/zzq919101/p/6017152.html)

          3.3.1 removeChild()示例代碼如下

          var tb = document.getElementById("tb");
          //先找到要刪除的節點,這里要刪除一行
          var tr = tb.lastChild.lastChild;
          //這里也需要父節點操作子節點
          tr.parentNode.removeChild(tr);???

          3.3.2 replaceChild()示例代碼

          var tb = document.getElementById("tb");
          var tr = document.createElement("tr");
          var td1 = document.createElement("td");
          var td2 = document.createElement("td");
          td1.innerHTML = "我的內容1";
          td2.innerHTML = "我的內容2";
          tr.appendChild(td1);
          tr.appendChild(td2);
          
          //父節點操作子節點
          //兩個參數,第一個表示新節點,第二個表示舊節點,這里用心節點替換舊節點
          tb.lastChild.replaceChild(tr,tb.lastChild.firstChild);??

          3.4 其他

          id,value等操作

          innerHTML和innerText的區別

          • 如果內容中有html標簽,使用innerHTML時,內容中的html標簽會被解析出來,而使用innerText時,html只會被當作文本顯示出來

          元素.style.樣式

          className

          3.5 示例

          代碼1:

          結果1:

          代碼2:

          結果2:

          代碼3:

          結果3:


          4. HTML DOM操作

          ? HTML文檔中的每個節點,都是DOM對象,每個DOM對象都有屬于自己的屬性和方法.

          ? HTML DOM在操作表格時,我們把一個表格看成是一個table對象,那么一個table對象是由若干個行對象(row)組成的,而其中每個行對象又是由若干個單元格對象(cell)組成的

          ? Table對象可以操作行對象,行對象可以操作單元格對象

          4.1 table表格對象

          類別 名稱 描述

          屬性 rows[] 返回包含表格中所有行的一個數組

          方法 insertRow() 在表格中插入一個新行

          方法 deleteRow() 從表格中刪除一行


          4.2 row行對象

          類別 名稱 描述

          屬性 cells[] 返回包含行中所有單元格的一個數組

          屬性 rowIndex 返回該行在表中的位置

          方法 insertCell() 在一行中的指定位置插入一個空的<td>標簽

          方法 deleteCell() 刪除行中指定的單元格


          另,對于單元格對象,還有cellIndex可以獲取單元格的索引號

          例如,這里需要在表格的末尾追加一行:

          ue.js設計與實現,文字可復制,高清PDF資源,需要的可以私我 :)


          內容介紹:

          本書基于Vue.js 3,從規范出發,以源碼為基礎,并結合大量直觀的配圖,循序漸進地講解Vue.js中各個功能模塊的實現,細致剖析框架設計原理。全書共18章,分為六篇,主要內容包括:框架設計概覽、響應系統、渲染器、組件化、編譯器和服務端渲染等。通過閱讀本書,對Vue.js 2/3具有上手經驗的開發人員能夠進一步理解Vue.js框架的實現細節,沒有Vue.js使用經驗但對框架設計感興趣的前端開發人員,能夠快速掌握Vue.js的設計原理。

          作者介紹:

          霍春陽(HcySunYang)
          Vue.js官方團隊成員,專注于Web研發領域,是Vue.js 3的核心貢獻者之一,Vue.js文檔生成工具Vuese的作者,技術社區活躍者,曾撰寫大量頗受好評的技術博客。

          本書目錄:

          第 1章 權衡的藝術 2
          1.1 命令式和聲明式 2
          1.2 性能與可維護性的權衡 3
          1.3 虛擬DOM的性能到底如何 4
          1.4 運行時和編譯時 8
          1.5 總結 11
          第 2章 框架設計的核心要素 12
          2.1 提升用戶的開發體驗 12
          2.2 控制框架代碼的體積 14
          2.3 框架要做到良好的Tree-Shaking 15
          2.4 框架應該輸出怎樣的構建產物 17
          2.5 特性開關 19
          2.6 錯誤處理 21
          2.7 良好的TypeScript類型支持 23
          2.8 總結 25
          第3章 Vue.js 3的設計思路 27
          3.1 聲明式地描述UI 27
          3.2 初識渲染器 29
          3.3 組件的本質 32
          3.4 模板的工作原理 34
          3.5 Vue.js是各個模塊組成的有機整體 36
          3.6 總結 37
          第4章 響應系統的作用與實現 40
          4.1 響應式數據與副作用函數 40
          4.2 響應式數據的基本實現 41
          4.3 設計一個完善的響應系統 43
          4.4 分支切換與cleanup 50
          4.5 嵌套的effect與effect棧 55
          4.6 避免無限遞歸循環 59
          4.7 調度執行 60
          4.8 計算屬性computed與lazy 64
          4.9 watch的實現原理 71
          4.10 立即執行的watch與回調執行時機 75
          4.11 過期的副作用 77
          4.12 總結 82
          第5章 非原始值的響應式方案 84
          5.1 理解Proxy和Reflect 84
          5.2 JavaScript對象及Proxy的工作原理 88
          5.3 如何代理Object 92
          5.4 合理地觸發響應 102
          5.5 淺響應與深響應 108
          5.6 只讀和淺只讀 110
          5.7 代理數組 113
          5.7.1 數組的索引與 length 114
          5.7.2 遍歷數組 119
          5.7.3 數組的查找方法 124
          5.7.4 隱式修改數組長度的原型方法 129
          5.8 代理Set和Map 132
          5.8.1 如何代理Set和Map 133
          5.8.2 建立響應聯系 137
          5.8.3 避免污染原始數據 140
          5.8.4 處理forEach 143
          5.8.5 迭代器方法 147
          5.8.6 values與keys方法 152
          5.9 總結 155
          第6章 原始值的響應式方案 158
          6.1 引入ref的概念 158
          6.2 響應丟失問題 160
          6.3 自動脫ref 164
          6.4 總結 166
          第7章 渲染器的設計 170
          7.1 渲染器與響應系統的結合 170
          7.2 渲染器的基本概念 172
          7.3 自定義渲染器 175
          7.4 總結 179
          第8章 掛載與更新 180
          8.1 掛載子節點和元素的屬性 180
          8.2 HTML Attributes與DOM Properties 182
          8.3 正確地設置元素屬性 184
          8.4 class的處理 189
          8.5 卸載操作 192
          8.6 區分vnode的類型 195
          8.7 事件的處理 196
          8.8 事件冒泡與更新時機問題 201
          8.9 更新子節點 204
          8.10 文本節點和注釋節點 209
          8.11 Fragment 212
          8.12 總結 215
          第9章 簡單Diff算法 218
          9.1 減少DOM操作的性能開銷 218
          9.2 DOM復用與key的作用 221
          9.3 找到需要移動的元素 225
          9.4 如何移動元素 228
          9.5 添加新元素 233
          9.6 移除不存在的元素 238
          9.7 總結 241
          第 10章 雙端Diff算法 242
          10.1 雙端比較的原理 242
          10.2 雙端比較的優勢 252
          10.3 非理想狀況的處理方式 255
          10.4 添加新元素 263
          10.5 移除不存在的元素 268
          10.6 總結 270
          第 11章 快速Diff算法 271
          11.1 相同的前置元素和后置元素 271
          11.2 判斷是否需要進行DOM移動操作 279
          11.3 如何移動元素 288
          11.4 總結 296
          第 12章 組件的實現原理 298
          12.1 渲染組件 298
          12.2 組件狀態與自更新 301
          12.3 組件實例與組件的生命周期 304
          12.4 props與組件的被動更新 306
          12.5 setup函數的作用與實現 311
          12.6 組件事件與emit的實現 314
          12.7 插槽的工作原理與實現 316
          12.8 注冊生命周期 318
          12.9 總結 320
          第 13章 異步組件與函數式組件 322
          13.1 異步組件要解決的問題 322
          13.2 異步組件的實現原理 324
          13.2.1 封裝defineAsyncComponent函數 324
          13.2.2 超時與Error組件 325
          13.2.3 延遲與Loading組件 328
          13.2.4 重試機制 331
          13.3 函數式組件 333
          13.4 總結 335
          第 14章 內建組件和模塊 337
          14.1 KeepAlive組件的實現原理 337
          14.1.1 組件的激活與失活 337
          14.1.2 include和exclude 342
          14.1.3 緩存管理 343
          14.2 Teleport組件的實現原理 346
          14.2.1 Teleport組件要解決的問題 346
          14.2.2 實現Teleport組件 347
          14.3 Transition組件的實現原理 350
          14.3.1 原生DOM的過渡 351
          14.3.2 實現Transition組件 356
          14.4 總結 360
          第 15章 編譯器核心技術概覽 364
          15.1 模板DSL的編譯器 364
          15.2 parser的實現原理與狀態機 368
          15.3 構造AST 374
          15.4 AST的轉換與插件化架構 383
          15.4.1 節點的訪問 383
          15.4.2 轉換上下文與節點操作 387
          15.4.3 進入與退出 392
          15.5 將模板AST轉為JavaScript AST 396
          15.6 代碼生成 402
          15.7 總結 407
          第 16章 解析器 409
          16.1 文本模式及其對解析器的影響 409
          16.2 遞歸下降算法構造模板AST 413
          16.3 狀態機的開啟與停止 419
          16.4 解析標簽節點 426
          16.5 解析屬性 430
          16.6 解析文本與解碼HTML實體 436
          16.6.1 解析文本 436
          16.6.2 解碼命名字符引用 438
          16.6.3 解碼數字字符引用 445
          16.7 解析插值與注釋 449
          16.8 總結 451
          第 17章 編譯優化 453
          17.1 動態節點收集與補丁標志 453
          17.1.1 傳統Diff算法的問題 453
          17.1.2 Block與PatchFlags 454
          17.1.3 收集動態節點 457
          17.1.4 渲染器的運行時支持 459
          17.2 Block樹 461
          17.2.1 帶有v-if指令的節點 462
          17.2.2 帶有v-for指令的節點 464
          17.2.3 Fragment的穩定性 465
          17.3 靜態提升 466
          17.4 預字符串化 468
          17.5 緩存內聯事件處理函數 469
          17.6 v-once 470
          17.7 總結 471
          第 18章 同構渲染 474
          18.1 CSR、SSR以及同構渲染 474
          18.2 將虛擬DOM渲染為HTML字符串 478
          18.3 將組件渲染為HTML字符串 484
          18.4 客戶端激活的原理 489
          18.5 編寫同構的代碼 494
          18.5.1 組件的生命周期 494
          18.5.2 使用跨平臺的API 496
          18.5.3 只在某一端引入模塊 496
          18.5.4 避免交叉請求引起的狀態污染 497
          18.5.5 組件 498
          18.6 總結 499


          Vue.js設計與實現,文字可復制,高清PDF資源,需要的可以私我 :)


          主站蜘蛛池模板: 国产不卡视频一区二区三区| 国产一区在线mmai| 日本一区二区三区久久| 中文字幕人妻无码一区二区三区| 亚洲Av无码国产一区二区| 国产精品香蕉一区二区三区| 蜜桃无码AV一区二区| 无码播放一区二区三区| 成人丝袜激情一区二区| 精品国产一区二区三区2021| 中文字幕一区二区三区永久| 无码人妻久久一区二区三区| 亚洲国产成人精品无码一区二区| 亚洲国产福利精品一区二区| 无码中文人妻在线一区| 色视频综合无码一区二区三区| 久久久久人妻精品一区三寸蜜桃| 波多野结衣AV无码久久一区| 成人免费观看一区二区| 一区二区三区视频免费观看| 亚洲国产成人一区二区三区| 性色AV一区二区三区无码| 亚洲一区二区三区在线视频| 亚欧免费视频一区二区三区| 国产在线无码视频一区| 无码精品人妻一区二区三区漫画| 国语对白一区二区三区| 久久一区二区精品| 色一情一乱一伦一区二区三区| 无码毛片视频一区二区本码| 国产精品一区二区香蕉| 久久精品国产AV一区二区三区| 国产高清在线精品一区小说 | 久久精品无码一区二区三区日韩| 一区二区三区在线免费| 人妻av综合天堂一区| 精品一区二区久久久久久久网站| 波多野结衣中文一区| 久久er99热精品一区二区| 亚洲中文字幕无码一区二区三区 | 国产精品久久亚洲一区二区|