一、數組的深淺拷貝
在使用JavaScript對數組進行操作的時候,我們經常需要將數組進行備份,事實證明如果只是簡單的將它賦予其他變量,那么我們只要更改其中的任何一個,然后其他的也會跟著改變,這就導致了問題的發(fā)生。
這是為什么呢?
因為如果只是簡單的賦值,它只是進行了地址的引用,所以改變一個另一個也會跟著變。
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像上面這樣就屬于淺拷貝,那我們怎么樣才能不改變原始的呢?
方法一:js的slice函數
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() 方法用于連接兩個或多個數組。
該方法不會改變現有的數組,而僅僅會返回被連接數組的一個副本。
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; }object()方法:json格式的發(fā)明人Douglas Crockford,提出了一個object()函數,可以做到這一點。
function object(o) { function F() {} F.prototype = o; return new F(); }//這個object()函數,其實只做一件事,就是把子對象的prototype屬性,指向父對象,從而使得子對象與父對象連在一起。使用的時候,第一步先在父對象的基礎上,生成子對象:
var Doctor = object(Chinese);//然后,再加上子對象本身的屬性:Doctor.career = '醫(yī)生';//這時,子對象已經繼承了父對象的屬性了。alert(Doctor.nation); //中國
下面我們看看阮一峰的方法
比如,現在有一個對象,叫做"中國人"。
新聞熱點
疑難解答
圖片精選