本文實例講述了javascript深拷貝的原理與實現方法。分享給大家供大家參考,具體如下:
要講JavaScript的拷貝,就得先講講javascript中的值傳遞和引用傳遞。
javascript中沒有一個具體的語法來規定哪些參數是引用傳遞,而其他語言中都有明文規定,比如 C# 中的 ref 和 PHP 中的 & 。
這也是javascript眾多弊端中的一個。
我們先看看下面這段代碼:
//值傳遞var i = 3;var j = i;j = 4;document.write(i);//3//引用傳遞var m = [1];var n = m;n[0] = 2;document.write(n[0]);//2
說明,javascript中只有簡單類型是值傳遞,而其他復雜類型比如數組、對象都是默認就是引用傳遞的。
那么我們如果需要復制一個對象呢?就必須自己定義方法:
//深度拷貝函數,其實就是值傳遞function cloneObject(srcobj){ var tarobj=new Object(); for(var key in srcobj){//判斷對象中是否繼續為對象 tarobj[key]=typeof srcobj[key]==='object'?cloneObject(srcobj[key]):srcobj[key]; } return tarobj;}//驗證深度拷貝函數的使用// 測試用例:var srcObj = { a: 1, b: { b1: ["hello", "hi"], b2: "JavaScript" }};var abObj = srcObj;//引用傳遞var tarObj = cloneObject(srcObj);srcObj.a = 2;srcObj.b.b1[0] = "Hello";console.log(abObj.a);//2console.log(abObj.b.b1[0]);//Hello,說明普通的=是一種引用傳遞console.log(tarObj.a); // 1console.log(tarObj.b.b1[0]); // "hello",說明我們定義的深拷貝是值傳遞其實就是通過實例化一個新的對象,從而在堆中開辟一塊新的內存空間,使得棧中的變量名指向堆中的新內容。
更多關于JavaScript相關內容可查看本站專題:《javascript面向對象入門教程》、《JavaScript中json操作技巧總結》、《JavaScript切換特效與技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript動畫特效與技巧匯總》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程序設計有所幫助。
新聞熱點
疑難解答