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節點,深度克隆,克隆節點以及節點下面的子內容。