關於對象、數組的深拷貝總結

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轉換

注意哦如果只是一維數組或者一維對象,不存在淺拷貝和深拷貝的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章