浅拷贝和深拷贝,JSON.parse(JSON.stringify(obj))

浅拷贝和深拷贝

  • 浅拷贝
    • 另一种方法:es6新增的方法
  • 深拷贝
    • 用一行代码实现深拷贝

浅拷贝和深拷贝
1.浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用(内存地址)
2.深拷贝拷贝多层,每一级别的数据都会拷贝

浅拷贝

var obj = {
     
id:1,
name: ‘andy’,
msg: {
     
   age:18
}
   }
var o = {
     }
for (var k in obj) {
     
// k 是属性名 obj[k] 属性值
o[k] = obj[k]
}
console.log(o)

浅拷贝只拷贝一层更深层次的拷贝的是内存地址,你改变了值,原数据也会跟着变

另一种方法:es6新增的方法

Object.assign(target,...sources) 
Object.assign(o,obj)
console.log(o)
o.msg.age = 20
console.log(obj)

深拷贝

// 深拷贝
  var obj = {
    id: 1,
    name: 'andy',
    msg: {
      age: 18
    },
    color: ['pink', 'red']
  }
  var o = {}
  // 封装函数
  function deepCopy(newobj, oldobj) {
    for (var k in oldobj) {
      // 判断我们的属性值属于哪种数据类型(简单数据类型 复杂数据类型)
      // 1.获取属性值 oldobj[k]
      var item = oldobj[k]
      // 2.判断这个值是否是数组
      if(item instanceof Array) {
        newobj[k] = []
        deepCopy(newobj[k],item)
        // 数组也是对象,如果先判断对象,那么数组也会当作对象判断了,所以先要判断数组
      } else if(item instanceof Object){
      // 3.判断这个值是否是对象
         newobj[k] = {}
         deepCopy(newobj[k], item)
      } else {
      // 4.属于简单数据类型
         newobj[k] = item
      }

    }
  }
  deepCopy(o,obj)
  console.log(o);
  o.msg.age = 20
  console.log(obj);

深拷贝,拷贝的是整个对象,你改变数据,原数据不变

浅拷贝只是复制指向某个对象的指针,而不是复制对象本身,新旧对象还是共享的同一块内存。
深拷贝会创造一个一模一样的对象,新对象和原对象不共享一块内存,修改新对象不会改到原对象
浅拷贝和深拷贝,JSON.parse(JSON.stringify(obj))_第1张图片

图片来源:https://segmentfault.com/a/1190000018874254

用一行代码实现深拷贝

JSON.parse(JSON.stringify(obj))
利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象
具体详情:
https://www.jianshu.com/p/b084dfaad501

你可能感兴趣的:(笔记,js,javascript,es6,前端)