淺拷貝:就是當(dāng)被拷貝的對(duì)象的某個(gè)屬性值為引用類型時(shí),拷貝的對(duì)象會(huì)將被拷貝的對(duì)象的這個(gè)屬性的引用的地址拷貝過來,這樣當(dāng)引用值里面的值變化時(shí),無論是拷貝還是被拷貝的對(duì)象,其屬性都會(huì)發(fā)生變化.
深拷貝:就是拷貝的對(duì)象將被拷貝的對(duì)象的引用的地址里面的值真正的拷貝過來,無論其中誰發(fā)生改變另外一個(gè)的值都不會(huì)發(fā)生改變.
也就是說,深淺拷貝的區(qū)別在于其屬性值不為基本類型時(shí),拷貝的地址的引用問題,淺拷貝時(shí)地址引用指向同一處,深拷貝時(shí)地址引用不是指向同一處.
function clone(target , origin){
? ? var target = target || {};
? ? for( var prop in origin){
? ? ? ? target[prop]? =? origin[prop];
????}
? ? return target;
}
1.判斷是不是原始值? typeof()? ?object 當(dāng)然null要做特殊處理
2.判斷是數(shù)組還是對(duì)象,那如果是函數(shù)呢?? instanceof? ?toString? ?constructor
3.建立相應(yīng)的數(shù)組或?qū)ο?/p>
4.遞歸
function deepClone(target , origin){
? ? var target = target || {},
? ? ? ? ? toStr = Obejct.prototype.toString,
? ? ? ? ?arrStr = "Object Array";
? ? for(var prop in origin){
? ? ? ? if(origin.hasOwnProperty(prop)){
? ? ? ? ? ? ? ? if(typeof(origin[prop])? == "Object"? &&? origin[prop] !== null){
? ? ? ? ? ? ? ? ? ? ? ? target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
? ? ? ? ? ? ? ? ? ? ? ? deepClone(target[prop] , origin[prop]);? ?//遞歸判斷其屬性是否為引用類型
????????????????}else{
? ? ? ? ? ? ? ? ? ? ? ? target[prop] = origin[prop];
????????????????}
????????}
????}
? ? return target;
}