首先來看一下以下代碼vue
let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e = f = {a:1,b:2,c:3} c[0] = 2 e.a = 2 console.log(d[0]) console.log(f.a)
你會發現,同一個Array或者Object賦值給兩個不一樣變量時,變量指向的是同一個內存地址,因此就會形成其中一個變量改變屬性值,同時改變了另一個變量的對應屬性值。數組
而大多數實際項目中,咱們想要的結果是兩個變量(初始值相同)互不影響。因此就要使用到 拷貝(分爲深淺兩種)
淺拷貝只複製一層對象的屬性,而深拷貝則遞歸複製了全部層級。
淺拷貝有效性針對的是單一層級對象 [1,2,3]或者{a:1,b:2}
深拷貝有效性針對的是單層或者多層級對象 [1,2,3]或者{a:1,b:2}或者[1,[1],{a:1}]或者{a:[1],b:{c:2}}
// 數組 let a = [1,2] let b = a.slice() // {} let e = {a:[1],b:{d:1},2} let f = Object.create(e) function shallowCopy (obj) { if (typeof obj === 'object' && obj !== null) { if (Array.isArray(obj)) { return obj.slice() } else { let result = {} Object.keys(obj).forEach((item,i) = > { console.log(i) result[item] = obj[item] }) return result } } else { return obj } }
// 利用JSON(它能正確處理的對象是Number, String, Boolean, Array, 扁平對象) let g = JSON.parse(JSON.stringify(obj)) // 適用於 function deepCopy (obj) { if (typeof obj === 'object' && obj !== null) { let objKeys = Object.keys(obj) let result if (Array.isArray(obj)) { result = [] } else { if (obj.constructor === Object) { result = {} } else { return obj } } objKeys.forEach((item) => { if (typeof obj[item] === 'object' && obj[item] !== null) { switch (obj[item].constructor) { case Array: result[item] = deepCopy(obj[item]) break case Object: result[item] = deepCopy(obj[item]) break case Date: result[item] = new Date(obj[item]) break case RegExp: let attributes = '' attributes += obj[item].global ? 'g' : '' attributes += obj[item].ignoreCase ? 'g' : '' attributes += obj[item].multiline ? 'g' : '' result[item] = new RegExp(obj[item].source, attributes); break default: result[item] = obj[item] break } } else { result[item] = obj[item] } }) return result } else { return obj } }