var arr = [“a”,“b”];
var arrCopy = arr;
arrCopy[1] = “c”;
arr // => [“a”,“c”]
對於對象和數字都存在這種問題淺拷貝,上述的可以遍歷遞歸等方法賦值,數組還有contact內置方法
數組的深拷貝(只適用於單層循環eg: [1,2,3,4,5]而不是[1,2,3,4,[5,6]])
- for 循環實現數組的深拷貝
var arr = [1,2,3,4,5]
var arr2 = copyArr(arr)
function copyArr(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
res.push(arr[i])
}
return res
}
- slice 方法實現數組的深拷貝(原數組中抽離部分出來形成一個新數組)
var arr = [1,2,3,4,5]
var arr2 = arr.slice(0)
arr[2] = 5
console.log(arr)
console.log(arr2)
- concat 方法實現數組的深拷貝
var arr = [1,2,3,4,5]
var arr2 = arr.concat()
arr[2] = 5
console.log(arr)
console.log(arr2)
- ES6擴展運算符實現數組的深拷貝
var arr = [1,2,3,4,5]
var [ ...arr2 ] = arr
arr[2] = 5
console.log(arr)
console.log(arr2)
對象的深拷貝(適用於單層對象)
- for循環實現對象的深拷貝
var obj = {
name: 'FungLeo',
sex: 'man',
old: '18'
}
var obj2 = copyObj(obj)
function copyObj(obj) {
let res = {}
for (var key in obj) {
res[key] = obj[key]
}
return res
}
- 擴展運算符實現對象的深拷貝
var obj = {
name: 'FungLeo',
sex: 'man',
old: '18'
}
var { ...obj2 } = obj
obj.old = '22'
console.log(obj)
console.log(obj2)
- 補充es6的對象拷貝方法(拷貝可枚舉類型對象)
Object.assign({},...obj)
終極方法
對象直接轉成字符串然後賦值不存在棧的存儲JSON.stringify();然後用JSON.parse(),相互轉換
const obj = {
id: 0,
name: '張三',
age: 12
}
const objToStr = JSON.stringify(obj)
console.log('obj:', obj)
console.log('objToStr:', JSON.parse(objToStr ))
數組可以用內置的方法join和split轉換
注意哦如果只是一維數組或者一維對象,不存在淺拷貝和深拷貝的問題