鍍金池/ 教程/ HTML/ 淺談 Javascript 中深復(fù)制
淺談 JavaScript 之事件綁定
淺談 javascript 中字符串 String 與數(shù)組 Array
淺談 javascript 中基本包裝類型
淺談 JavaScript Math 和 Number 對(duì)象
淺談 Javascript 的靜態(tài)屬性和原型屬性
淺談 JavaScript 中定義變量時(shí)有無 var 聲明的區(qū)別
淺談 JavaScript Array 對(duì)象
淺談 JavaScript 函數(shù)參數(shù)的可修改性問題
淺談 javascript 中的 instanceof 和 typeof
淺談 JavaScript 中 Date (日期對(duì)象),Math 對(duì)象
淺談 Javascript 執(zhí)行順序
淺談 javascript 函數(shù)屬性和方法
淺談 JavaScript 中面向?qū)ο蠹夹g(shù)的模擬
淺談 javascript 的原型繼承
淺談 javascript 事件取消和阻止冒泡
根據(jù)一段代碼淺談 Javascript 閉包
淺談 Javascript 面向?qū)ο缶幊?/span>
淺談 javascript 六種數(shù)據(jù)類型以及特殊注意點(diǎn)
淺談 Javascript 變量作用域問題
淺談 javascript 函數(shù)內(nèi)部屬性
淺談 javascript 中自定義模版
淺談 JavaScript 字符集
淺談 javascript 面向?qū)ο缶幊?/span>
淺談 JavaScript 框架分類
淺談 JavaScript 中的 Math.atan() 方法的使用
淺談 Javascript 數(shù)組與字典
淺談 JavaScript 數(shù)據(jù)類型及轉(zhuǎn)換
淺談 javascript 的調(diào)試
淺談 Javascript 嵌套函數(shù)及閉包
淺談 javascript 回調(diào)函數(shù)
淺談 JavaScript Date 日期和時(shí)間對(duì)象
淺談 Javascript 中的 Function 與 Object
淺談 JavaScript 數(shù)據(jù)類型
淺談 javascript 中 this 在事件中的應(yīng)用
淺談 javascript 中的閉包
淺談 javascript 函數(shù)劫持
淺談 Javascript 中深復(fù)制
淺談 JavaScript 函數(shù)節(jié)流
淺談 JavaScript 中的 String 對(duì)象常用方法
淺談 JavaScript 事件的屬性列表
淺談 JavaScript 函數(shù)與棧
淺談 JavaScript 的事件
淺談 javascript 中的作用域
淺談 JavaScript 的執(zhí)行效率
淺談 Javascript 事件模擬
淺談 JavaScript function 函數(shù)種類
淺談 javascript 歸并方法
淺談 javascript 迭代方法
淺談 JavaScript 編程語(yǔ)言的編碼規(guī)范
淺談 JavaScript 實(shí)現(xiàn)面向?qū)ο笾械念?/span>
淺談 Javascript 鼠標(biāo)和滾輪事件
淺談 Javascript Base64 加密解密
淺談 Javascript 中勻速運(yùn)動(dòng)的停止條件
淺談 javascript 實(shí)現(xiàn)八大排序
淺談 javascript 的分號(hào)的使用
淺談 javascript 中 createElement 事件
淺談 javascript 的數(shù)據(jù)類型檢測(cè)
淺談 javascript 對(duì)象模型和 function 對(duì)象
淺談 Javascript 如何實(shí)現(xiàn)勻速運(yùn)動(dòng)
淺談 JavaScript 字符串與數(shù)組
淺談 javascript 面向?qū)ο蟪绦蛟O(shè)計(jì)
淺談 Javascript 事件處理程序的幾種方式

淺談 Javascript 中深復(fù)制

在 javascript 中,所有的 object 變量之間的賦值都是傳地址的,可能有同學(xué)會(huì)問哪些是 object 對(duì)象。舉例子來說明可能會(huì)比較好:

typeof(true)    //"boolean"  

typeof(1)       //"number"  

typeof("1")     //"string"  

typeof({})      //"object"  

typeof([])      //"object"  

typeof(null)    //"object"  

typeof(function(){})  //"function"  

所以其實(shí)我們深復(fù)制主要需要處理的對(duì)象就是 object 對(duì)象,非 object 對(duì)象只要直接正常的賦值就好。我實(shí)現(xiàn) js 深復(fù)制的思路就是:

遍歷所有該對(duì)象的屬性,

如果該屬性是 "object" 則需要特殊處理,

如果這個(gè) object 對(duì)象比較特殊,是一個(gè)數(shù)組,那就創(chuàng)建一個(gè)新的數(shù)組并深復(fù)制數(shù)組里的元素

如果這個(gè) object 對(duì)象是個(gè)非數(shù)組對(duì)象,那直接再對(duì)它遞歸調(diào)用深復(fù)制方法即可。

如果不是 "object",則直接正常復(fù)制就行。

下面就是我的實(shí)現(xiàn)了:

Object.prototype.DeepCopy = function () {  

  var obj, i;  

  obj = {};  
  for (attr in this) {  

    if (this.hasOwnProperty(attr)) {  

      if (typeof(this[attr]) === "object") {  

        if (this[attr] === null) {  

          obj[attr] = null;  

        }  

        else if (Object.prototype.toString.call(this[attr]) === '[object Array]') {  

          obj[attr] = [];  

          for (i=0; i<this[attr].length; i++) {  

            obj[attr].push(this[attr][i].DeepCopy());  

          }  

        } else {  

          obj[attr] = this[attr].DeepCopy();  

        }  

      } else {  

        obj[attr] = this[attr];  

      }  

    }  

  }  

  return obj;  

};  

如果瀏覽器支持 ECMAScript 5 的話,為了深復(fù)制對(duì)象屬性的所有特性,可以使用

Object.defineProperty(obj, attr, Object.getOwnPropertyDescriptor(this, attr));  

來替代

obj[attr] = this[attr];  

直接在 Object.prototype 上實(shí)現(xiàn)該方法的好處是,所有對(duì)象都會(huì)繼承該方法。壞處是某些庫(kù)也會(huì)改寫 Object 對(duì)象,所以有時(shí)會(huì)發(fā)生沖突。這是需要注意的。具體使用方法如下:

Object.prototype.DeepCopy = function () { ...}  

var a = {x:1};  

var b = a;  

var c = a.DeepCopy();  

a.x = 2;  

b.x = 3;  

console.log(a.x);   //3  

console.log(b.x);   //3  

console.log(c.x);   //1  

以上就是關(guān)于深復(fù)制的講解了,不過今天既然我們講了深復(fù)制,那么想對(duì)應(yīng)的還有淺復(fù)制,我們就來簡(jiǎn)單總結(jié)下他們之間的異同吧。

淺復(fù)制 (影子克隆): 只復(fù)制對(duì)象的基本類型, 對(duì)象類型, 仍屬于原來的引用。

深復(fù)制 (深度克隆): 不緊復(fù)制對(duì)象的基本類, 同時(shí)也復(fù)制原對(duì)象中的對(duì)象。就是說完全是新對(duì)象產(chǎn)生的。