深拷贝和浅拷贝

深浅拷贝的区分

浅拷贝:拷贝的是引用地址,当引用的值改变时,另外一个也会跟着改变;
浅拷贝是新旧对象还是共享同一块内存,改变其中一个,另一个也会受影响,。
 
深拷贝:复制出一个全新的对象实例,新对象跟原对象不共享内存,两者操作互不影响
 
深拷贝和浅拷贝的使用场景是在复杂对象里,复杂数据类型里:object,array,funtion
 

常用的浅拷贝实现方法

1,Object.assign

ES6中拷贝对象的方法,接受的第一个参数是拷贝的目标target,剩下的参数是拷贝的源对象sources(可以是多个)

let target = {};
let source = {
    a: '123',
    b: {name: 'javascript'}
}
Object.assign(target,source);
console.log(target); // {a:'123',b:{name:'javascript'}}

Object.assign使用注意事项:

  • 只拷贝源对象的自身属性(不拷贝继承属性)
  • 不会拷贝对象不可枚举的属性
  • undefined和null无法转成对象,他们不能作为Object.assign参数,但是可以作为源对象
  • 属性名为Symbol 值的属性,可以被Object.assign拷贝
let copy2 = Object.assign({}, {x:1})

 

2,Array.slice

let array = [{a:1},{b:2}]
let array1 = array.slice(0);
console.log(array1)

slice:从已有的数组中返回选定的元素

3,扩展运算符

let obj = {a:1,b:{c:1}}
let obj2 = {...obj}
console.log(obj2)

 参考:https://blog.csdn.net/weixin_42246997/article/details/107341725

 

二,实现深拷贝

// 1. JOSN.stringify()/JSON.parse()
let obj = {a: 1, b: {x: 3}}
JSON.parse(JSON.stringify(obj))
 
// 2. 递归拷贝
function deepClone(obj) {
  let copy = obj instanceof Array ? [] : {}
  for (let i in obj) {
    if (obj.hasOwnProperty(i)) {
      copy[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
    }
  }
  return copy
}

 

三,实现深浅拷贝

    // 浅拷贝实现
    function shallowCopy(obj) {
        var dst = {}
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                dst[prop] = obj[prop]
            }
        }
        return dst
    }

    var obj = { a: 1, arr: [2, 3] }
    var shallowObj = shallowCopy(obj)
    console.log(shallowObj.arr[1])

    shallowObj.arr[1] = 5;
    console.log(obj.arr[1])

    // 赋值
    let a = { 'name': '1111', 'age': 'dddd'}
    let b = a;
    b.name = 22;
    console.log(a)
    // 浅拷贝{name: 22, age: "dddd"}


    // 深拷贝:拷贝实例
    
    function deepCopy(obj) {
        if (obj instanceof Array) {
            let n = [];
            for (let i = 0; i < obj.length; i++) {
                n[i] = deepCopy(obj[i])
            }
            return n;
        } else if (obj instanceof Object) {
            let n = {};
            for (let i in obj) {
                n[i] = deepCopy(obj[i])
            }
            return n;
        } else {
            return obj
        }
    }
    var obj2 = { a: 1, arr: [2, 3] }
    var deepObj = deepCopy(obj2)
    console.log('深拷贝', deepObj.arr[0])
    deepObj.arr[1] = 6;
    console.log('深拷贝' + obj2.arr[0])

    // 深拷贝:通过JSON解析实现
    // 把一个对象转成json字符串在转成json对象
    let obj3 = { 'a': 1, 'b': 2 }
    JSON.parse(JSON.stringify(obj3))

    // 参考:https://www.imooc.com/article/68975

 

 
posted @ 2020-08-08 17:54  云悠  阅读(3159)  评论(0编辑  收藏  举报