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"
}
*/

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM