深度複製實例分析

来源:http://www.cnblogs.com/sharpall/archive/2016/10/24/5991879.html
-Advertisement-
Play Games

javascript的一切實例都是對象,只是對象之間稍有不同,分為基本類型和引用類型。 基本類型對象指的是字元串(String)、數值(Number)、布爾值(Boolean),引用類型對象指的是數組(Array)、對象(Object)、函數(Function)。 這兩類數據的引用有差別。普通對象存 ...


  javascript的一切實例都是對象,只是對象之間稍有不同,分為基本類型和引用類型。 基本類型對象指的是字元串(String)、數值(Number)、布爾值(Boolean),引用類型對象指的是數組(Array)、對象(Object)、函數(Function)。

  這兩類數據的引用有差別。普通對象存儲的是對象的實際數據,而引用對象存儲的是對象的引用地址,而把對象的實際內容單獨存放,因為引用對象通常比較龐大,這是數據開銷和記憶體開銷優化的手段。 就像對象的原型一樣,也是同一個概念。對象的原型也是引用對象,把原型的方法和屬性放在單獨記憶體當中,而對象的原型鏈則指向這個記憶體地址。

  但有時我們需要的並不是指向記憶體區域的指針,而是記憶體中整個數據的備份(因為不想改動原數據)。不同的引用類型備份方法並不相同,於是我們對此封裝了統一的深度複製介面。

 1 function deepCopy(source) {
 2     var result = {};
 3     for (var key in source) {
 4         var type = Object.prototype.toString.call(source[key]);
 5         switch (type) {
 6             case "[object Number]":
 7             case "[object String]":
 8                 result[key] = source[key];
 9                 break;
10             case "[object Array]":
11                 result[key] = source[key].slice(0);
12                 break;
13             default:
14                 result[key] = deepCopy(source[key]);
15         }
16     }
17     return result;
18 }

  這裡我們遍歷了source對象的屬性,使其劫持js對象原型的類型判別方法,當其是基本類型時直接賦值,是引用類型的數組類型時調用slice方法 截取整個數組(該方法返回的即時原數組備份),當其是其他對象時嵌套執行該函數。最終得到整個對象的備份。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 可滾動選日期,並限制哪些日期可選和不可選。 主要用來根據後臺返回生成一個日期選擇器。 具體實現可關註jmslip: https://github.com/jiamao/jmSlip 示例:http://slip.jm47.com/demo/calendar/index.html ...
  • ng-init是給angular執行給定的表達式,初始化變數的值 這樣就初始化了myTest的值,ng-app沒有設值,要是設置的話,就要js啦,要不然就得報錯了 ...
  • 裝飾者模式筆記 在不改變原對象的基礎上, 通過對其進行包裝拓展(添加屬性或方法)使原有對象可以滿足用戶的更複雜要求。 需求不是一成不變的,需求會不斷改進,以增強用戶體驗 demo實例:對輸入框添加focus與blur事件 這個實例中,輸入框只有一兩個時,新添需求不覺得麻煩,當有許多輸入框都要新添需求 ...
  • directive裡面的幾個配置,上代碼就清晰了 這段代碼在瀏覽器上打開是這樣的, 看到嗎,directive裡面的template在標簽的裡面,是標簽的子元素 然後再看,在配置一個replace replace為true的時候可以看到的是原來的自定義標簽被template替代了 要是restric ...
  • 這裡多謝某童鞋的提醒!說我的上篇隨筆jquery插件開發的方式一還還可用於合併參數和深clone,雖然方式二中用了方式一做參數合併,但並未詳細介紹,所以今天在此處做點補充! 一、合併參數 jquery的extend擴展原型: 返回值未arg1,arg2……合併到arg。這裡就有兩種用法。 省略arg ...
  • avalon.js是一款迷你的MVVM框架,設計者將其相容到了IE6。輕巧的體積和良好的相容使它非常適合國內的某些項目(學校、政府、銀行)。然而有時候居然出現了在ie上無法渲染的情況。 例如下列這段簡單的demo: 在chrome上的顯示是: 而在ie8上顯示卻是這樣: 大家不要慌張,可能是你加入了 ...
  • 一,JS模塊化演變過程 1.普通函數封裝 最初的這種普通函數封裝的缺點很明顯:污染了全局變數,無法避免的會與其他模塊發生變數名衝突,而且自身模塊成員之間沒有任何聯繫,,說白了就是沒有做到“高內聚,低耦合”原則 2.對象 技術一直在進步,這種做法的避免了變數污染,只要保證模塊名唯一即可,自身模塊內的成 ...
  • 所謂彈性滾動就是指在翻動長頁面手指離開時,有由慢到塊,由快到慢的過度。 安卓平臺上的大多數瀏覽器都預設了該行為 ios當前還只對<body>下的 overflow 預設產生彈性滾動效果 前一陣子做了一個手機官網,用到了 <div> 中的 overflow,再調試 ios 中遇到了彈性滾動的問題: i ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...