js深拷貝和淺拷貝

來源:互聯網
上載者:User

標籤:style   blog   java   color   使用   strong   

一、數組的深淺拷貝

在使用JavaScript對數組進行操作的時候,我們經常需要將數組進行備份,事實證明如果只是簡單的將它賦予其他變數,那麼我們只要更改其中的任何一個,然後其他的也會跟著改變,這就導致了問題的發生。

var arr = ["One","Two","Three"];var arrto = arr;arrto[1] = "test";document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,test,Threedocument.writeln("數組的新值:" + arrto + "<br />");//Export:數組的新值:One,test,Three

像上面的這種直接賦值的方式就是淺拷貝,很多時候,這樣並不是我們想要得到的結果,其實我們想要的是arr的值不變,不是嗎?
方法一:js的slice函數

對於array對象的slice函數,返回一個數組的一段。(仍為數組)arrayObj.slice(start, [end])參數arrayObj必選項。一個 Array 對象。start必選項。arrayObj 中所指定的部分的開始元素是從零開始計算的下標。end可選項。arrayObj 中所指定的部分的結束元素是從零開始計算的下標。說明slice 方法返回一個 Array 對象,其中包含了 arrayObj 的指定部分。slice 方法一直複製到 end 所指定的元素,但是不包括該元素。如果 start 為負,將它作為 length + start處理,此處 length 為數組的長度。如果 end 為負,就將它作為 length + end 處理,此處 length 為數組的長度。如果省略 end ,那麼 slice 方法將一直複製到 arrayObj 的結尾。如果 end 出現在 start 之前,不複製任何元素到新數組中。

var arr = ["One","Two","Three"];var arrtoo = arr.slice(0);arrtoo[1] = "set Map";document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Threedocument.writeln("數組的新值:" + arrtoo + "<br />");//Export:數組的新值:One,set Map,Three

方法二:js的concat方法

concat() 方法用於串連兩個或多個數組。該方法不會改變現有的數組,而僅僅會返回被串連數組的一個副本。文法arrayObject.concat(arrayX,arrayX,......,arrayX)說明返回一個新的數組。該數組是通過把所有 arrayX 參數添加到 arrayObject 中產生的。如果要進行 concat() 操作的參數是數組,那麼添加的是數組中的元素,而不是數組。

var arr = ["One","Two","Three"];var arrtooo = arr.concat();arrtooo[1] = "set Map To";document.writeln("數組的原始值:" + arr + "<br />");//Export:數組的原始值:One,Two,Threedocument.writeln("數組的新值:" + arrtooo + "<br />");//Export:數組的新值:One,set Map To,Three

二、對象的深淺拷貝

var a={name:‘yy‘,age:26};var b=new Object();b.name=a.name;b.age=a.age;a.name=‘xx‘;console.log(b);//Object { name="yy", age=26}console.log(a);//Object { name="xx", age=26}

就是把對象的屬性遍曆一遍,賦給一個新的對象。

var deepCopy= function(source) { 
var result={};
for (var key in source) {
      result[key] = typeof source[key]===’object’? deepCoyp(source[key]): source[key];
   }    return result; }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.