1. 程式人生 > 其它 >js深拷貝的幾種方式

js深拷貝的幾種方式

1、利用json

var obj = {
  name: "test",
  desc: "origin"
}

function deepCopy(obj) {
  var a = JSON.stringify(obj)
  var newobj = JSON.parse(a)
  return newobj
}

var obj2 = obj    // 淺拷貝
var obj3 = deepCopy(obj)  // 深拷貝

obj.name = "change"

console.log(obj2) // { desc: "origin", name: "change" }
console.log(obj3) //
{ desc: "origin", name: "test" } // 該種方法只能拷貝 value無 function 型別的

2、利用Object.assin()

var obj = {
  name: "test",
  desc: "origin"
}

var obj2 = Object.assign(obj)

obj.name = "change"
console.log(obj2)  // { name: "change", desc: "origin" }

// 當物件裡只有一級屬性時可以這麼寫, 二級的時候就變成淺拷貝了

3、利用遞迴

var obj = {
  name: 
"test", desc: "origin", sendobj: { name: "test2", desc: "origin2" } } function copy(obj) { let newobj = null // 接受拷貝的新物件 if(typeof(obj) == 'object' && typeof(obj) !== null) { // 判斷是否是引用型別 newobj = obj instanceof Array? []: {} // 判斷是陣列還是物件 for(var i in
obj) { newobj[i] = copy(obj[i]) // 判斷下一級是否還是引用型別 } } else { newobj = obj } return newobj } var obj1 = copy(obj) obj.sendobj.name = "change" console.log(obj1) /* desc: "origin" name: "test" sendobj: { desc: "origin2" name: "test2" } */