淺談Javascript 中幾種克隆(clone)方式


clone就是把原來的東西原樣復制一份,新復制的東西和以前的東西沒有任何關系

一:在Javascript里,如果克隆對象是基本類型,我們直接賦值就可以了:

var sStr = "kingwell";  
var cStr = sStr;  
 alert(cStr);//輸出kingwell  
sStr = "abc";  
alert(cStr);//輸出kingwell; 

把一個值賦給另一個變量時,當那個變量的值改變的時候,另一個值不會受到影響。

這里需要注意的是,復制會把A對象的值復制一份給B,由於是基本類型,這個值不再指向其他地方,所以當A的值發生改變時,B的值不會改變,但是如果賦值的是對象的話,情況就不同了,雖然也是把A的值復制給B,但是這個值指向堆內存,堆內存里存儲的才是真正的內容,所以當A對象來改變這個內容的時候,B指向的內容也就發生了變化

二:如果不是基本類型,那就有所有不同了:

var aArr = [0,1,2,3];  
var m = aArrr;  
alert(m);//輸出1,2,3  
aArr=[1,1,2,3];  
alert(m);//輸出1,1,2,3;這個值改變了,因為m只是aArr的一個引用,如果aArr的值改變了,那么m也會相應的改變。  

如果我們想克隆一個數組,最簡單的辦法:

var aArr = [0,1,2,3];  
var m = aArr.slice(0);  
aArr = [3,2,1,0];  
alert(m);//輸出0,1,2,3,這時雖然aArr中的值已經改變,但是因為使用slice方法已經創建一個新的數組。 

我們可以創建一個函數來克隆所有對象:

function clone(obj) {  
    var o;  
    if (typeof obj == "object") {  
        if (obj === null) {  
            o = null;  
        } else {  
            if (obj instanceof Array) {  
                o = [];  
                for (var i = 0, len = obj.length; i < len; i++) {  
                    o.push(clone(obj[i]));  
                }  
            } else {  
                o = {};  
                for (var j in obj) {  
                    o[j] = clone(obj[j]);  
                }  
            }  
        }  
    } else {  
        o = obj;  
    }  
    return o;  
}  

三:節點克隆:

var p = document.getElementsByTagName("p")[0];  
var cP = p.cloneNode();//克隆p節點  
var cP = p.cloneNode(true);//克隆p節點,深度克隆,克隆節點以及節點下面的子內容。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM