深浅拷贝

一、浅拷贝

  浅拷贝是拷贝对象中的非引用类型属性的值和引用类型属性的引用。

function shollowCopy(obj) {
    let constructor = obj.constructor;
    let tempObj = new constructor();
    for(let prop in obj) {
        if(obj.hasOwnProperty(prop)) {
            tempObj[prop] = obj[prop]
        }
    }
    return tempObj;
}

  注意:浅拷贝与赋值操作不同。

var obj = {
  name: 'mark',
  arr: [1,2,3]  
}

// 赋值操作
var obj2 = obj;
obj === obj2;  // true, 这里obj指向的地址与obj2指向的地址相同

var obj3 = shollowCopy(obj);
obj3 === obj; // false, 这里obj3是新建的一个对象,其属性为对原来对象中非引用类型属性的复制和引用类型属性的引用;

 

二、深拷贝

  深拷贝就是对遍历对象的所有属性,复制原对象的非引用类型属性,并对引用类型属性进行递归的深拷贝。

function deepCopy(obj) {
    let constructor = obj.constructor,
        tempObj;
    // obj 是基本类型数据时
    if(['string', 'number', 'boolean', 'undefined'].includes(typeof obj) || obj === null) {
        return obj;
    }
    // obj是Data、RegExp、Error时,Function暂时无法
    if(obj instanceof Date || obj instanceof Error || obj instanceof RegExp) {
        tempObj = new constructor(obj);
        return tempObj;
    }
    
    for(let prop in obj) {
        if(obj.hasOwnProperty(prop)) {
            tempObj[prop] = deepCopy(obj[prop])
        }
    }
    return tempObj;
}

三、原生提供的浅拷贝方法

  对于数组有。arr.slice() arr.concat()

  对于对象有: Object.assign

 

posted @ 2019-09-07 11:11  iszhangjin  阅读(142)  评论(0)    收藏  举报