(1)關(guān)于兩種數(shù)據(jù)類型
數(shù)據(jù)類型:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
基本數(shù)據(jù)類型包括以下
- Undefined
- Null
- Boolean
- Number
- String
數(shù)據(jù)存儲方式
- 基本數(shù)據(jù)類型存儲在棧內(nèi)存
- 引用數(shù)據(jù)類型類型存儲在堆內(nèi)存中
var a = 1;//定義了一個number類型
var obj1 = {//定義了一個obj類型
name:'obj'
};
代碼執(zhí)行后,內(nèi)存空間如下

這時候變量值obj1保存在??臻g中,真正對象保存在堆空間,我們只是通過變量中的引用類型的地址類操作實際對象
這時候我們接著執(zhí)行下列代碼:
var obj2 = obj1
obj2.name='obj2'
console.log(obj1)

我們發(fā)現(xiàn)這時候改變obj2中的name值,打印obj1的時候,發(fā)現(xiàn)obj1的name值也被改變了.
導(dǎo)致這一現(xiàn)象的原因是:
我們只是復(fù)制了一次引用類型的地址,所以,不管接下來我們是操作obj1還是obj2,本質(zhì)上都是操作同一個對象。
深復(fù)制和淺復(fù)制
淺拷貝
淺拷貝:不能深層次的復(fù)制,如果對象里面有對象話,就實現(xiàn)不了復(fù)制
淺拷貝方法一
var obj2 = {}
for (const key in obj1) {
obj2[key]=obj1[key]
}
console.log(obj2)
淺拷貝方法二
var obj2 = Object.assign({},obj1)
console.log(obj2)
淺拷貝方法三
var obj2 = {...obj1}
console.log(obj2)
深拷貝
一.遞歸實現(xiàn)深拷貝
(1)首先使用instanceof判斷深拷貝對象是數(shù)組還是對象
(2)關(guān)于Object.entries(obj)方法
let a = ['張三','李四']
console.log(JSON.stringify(Object.entries(a),null,2))
let b = {name:'張三',title:'李四'}
console.log(JSON.stringify(Object.entries(b),null,2))

打印返回的數(shù)據(jù)結(jié)果
(3)
function deepCopy(obj) {
let res = obj instanceof Array ? [] : {}
for (const [k, v] of Object.entries(obj)) {
res[k] = typeof v == "object" ? deepCopy(v) : v
}
return res
}
調(diào)用函數(shù)驗證結(jié)果
let arr = [11, 33, [1, 2, 3], 55, 77, 99]
console.dir(arr)
let arr1 = deepCopy(arr)
arr1[2][2] = 4
console.dir(arr1)

驗證成功
二.使用JSON對象的stringify和parse方法
不拷貝引用對象,拷貝一個字符串會新辟一個新的存儲地址,這樣就切斷了引用對象的指針聯(lián)系。
var a=[1,2,3]
var b=JSON.parse(JSON.stringify(a));
b.push(4);
console.log(b);//1,2,3,4
console.log(a)//1,2,3