我們了解到物件(引用)型別在賦值的過程中其實是複製了位址,從而會導致改變了一方其他也都被改變的情況。通常在開發中我們不希望出現這樣的問題。
let a =
let b = a
a.age = 2
console.log(b.age) // 2 希望是1
let a =
}let b = a
a.obj.aa = 5
console.log(b.obj.aa) // 5 希望是3
1)淺拷貝
如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。
function shallowcopy(obj) ;
// 只複製可遍歷的屬性
for (key in obj)
}return copy;
}
let a =
let b = shallowcopy(a)
a.age = 2
console.log(b.age) // 1
js內部實現了淺拷貝,如object.assign(target, source)
,其中第乙個引數是我們最終複製的目標物件,後面的所有引數是我們的即將複製的源物件,支援物件或陣列,一般呼叫的方式為
var newobj = object.assign({}, originobj);
2)深拷貝
其實深拷貝可以拆分成 2 步,淺拷貝 + 遞迴,淺拷貝時判斷屬性值是否是物件,如果是物件就進行遞迴操作,兩個一結合就實現了深拷貝。
1、簡單實現
function clonedeep(source) ;
for(var key in source) 應該返回 null
// 問題二 陣列會轉成物件 [1,2] 會變成
target[key] = clonedeep(source[key]); // 注意這裡
} else }}
return target;
}
let a =
}let b = clonedeep(a)
a.obj.aa = 5
console.log(b.obj.aa) // 3
乙個簡單的深拷貝就完成了,但是這個實現還存在很多問題。
2、:解決以上兩個問題
function clonedeep2(source) ;
for(var key in source) else }}
return target;
}// 解決typeof null === 'object'
function isobject(obj)
3、
function deepclone(source)
//解決陣列相容
var target = array.isarray(source) ? : {};
for(let key in source)
return target;
}
JS深 淺拷貝
在js中,資料型別分為基本資料型別和引用資料型別兩種。對於基本資料型別來說,它的值直接儲存在棧記憶體中,而對於引用型別來說,它在棧記憶體中只是儲存了乙個指向對記憶體的引用,而真正的資料儲存在堆記憶體中。object array 這兩個就是引用型別,當我門直接去拷貝的話 copyobj obj 拷貝的...
js 深淺拷貝
深拷貝就是複製內部內容 淺拷貝就是複製記憶體位址 var obj 淺拷貝 引用傳遞 淺拷貝就是賦值,將鑰匙複製乙份 var o obj 深拷貝 內部內容複製乙份 將房子複製乙份 方法一 var str json stringify obj var obj3 json parse str 方法二 va...
js深淺拷貝
1.什麼是深淺拷貝 簡單的來說,加入b複製a a改變 如果b也跟著改變的話,那就是淺拷貝,反之是深拷貝 實現淺拷貝方法 1.賦值操作 var a 0 1,2 3,4 var b a a 0 5console log a 5,1,2,3,4 console log b 5,1,2,3,4 2.es6 ...