深拷貝和淺拷貝
// a = 基礎(chǔ)數(shù)據(jù)類(lèi)型 或 復(fù)雜數(shù)據(jù)類(lèi)型
// b = a
// 基本數(shù)據(jù)類(lèi)型 ?在賦值的時(shí)候值拷貝
// 復(fù)雜數(shù)據(jù)類(lèi)型 ?棧內(nèi)存中存地址,堆內(nèi)存中存真實(shí)的值,賦值后兩個(gè)變量指向同一塊內(nèi)存空間(或者說(shuō)只復(fù)制了指向某個(gè)對(duì)象的指針) ?修改被賦值的變量,原始變量也會(huì)跟著改變
// 深拷貝
// 1.Objecet.assign()
// 可以對(duì)非嵌套對(duì)象進(jìn)行深拷貝的方法,如果對(duì)象中出現(xiàn)嵌套情況,那么其他被嵌套對(duì)象的行為就成了普通的淺拷貝。
// 2.JSON.stringify()/JSON.parse()
// 對(duì)于 undefined、任意的函數(shù)以及 symbol 三個(gè)特殊的值分別作為對(duì)象屬性的值、數(shù)組元素、單獨(dú)的值時(shí) JSON.stringify()將返回不同的結(jié)果。
const data = {
? ? a: "aaa",
? ? b: undefined,
? ? c: Symbol("dd"),
? ? fn: function() {
? ? ? ? return true;
? ? }
? ?
};
? ?
JSON.stringify(data); // 輸出: "{"a":"aaa"}"
// 假設(shè) undefined、任意的函數(shù)以及 symbol 值作為數(shù)組元素會(huì)是怎樣呢
JSON.stringify(["aaa", undefined, function aa() {
? ? return true
? ?
}, Symbol('dd')]) // 輸出:"["aaa",null,null,null]"
// 單獨(dú)序列化這些值會(huì)是什么樣的結(jié)果呢
JSON.stringify(function a (){console.log('a')})
// undefined
JSON.stringify(undefined)
// undefined
JSON.stringify(Symbol('dd'))
// undefined
// 3.用遞歸的方式進(jìn)行深拷貝 ? (對(duì)象深拷貝)
function deepClone(dest,src){ ? ? ?//dest為目標(biāo)對(duì)象 ?src為源對(duì)象
? ? var dest=dest||{}
? ? for(var key in src){
? ? ? ? if(typeof src[key]==="object"){ ? ?//typeof[] 和 typeof{} 結(jié)果都是objct
? ? ? ? ? ? //如果對(duì)象的屬性又是對(duì)象
? ? ? ? ? ? dest[key]=(src[key].constructor===Array)?[]:{}
? ? ? ? ? ? deepClone(dest[key],src[key])
? ? ? ? }else{
? ? ? ? ? ? dest[key]=src[key]
? ? ? ? }
? ? }
? ? return dest
}
var a={
? ? name:"Bob",
? ? age:16,
? ? parents:{
? ? ? ? father:"Jack",
? ? ? ? mother:"Marry"
? ? }
}
var b=deepClone({},a)
console.log(a)
console.log(b)
// 4.引入函數(shù)庫(kù) lodash,該函數(shù)庫(kù)也有提供 _.cloneDeep()
var _ = require('lodash');
var obj1 = {
?a: 1,
?b: { f: { g: 1 } },
?c: [1, 2, 3]
};
var obj2 = _.cloneDeep(obj1);
console.log(obj1.b.f === obj2.b.f);
// 淺拷貝
// 1.Objecet.assign()
// 可以對(duì)非嵌套對(duì)象進(jìn)行深拷貝的方法,如果對(duì)象中出現(xiàn)嵌套情況,那么其他被嵌套對(duì)象的行為就成了普通的淺拷貝。
// 2.Array.concat() //數(shù)組連接
// 3.Array.slice() ?//數(shù)組切片