浅拷贝与深拷贝

概念

深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只复制一层对象的属性,而深复制则递归复制了所有层级。

实现

浅拷贝
1 Object.assign(newObj, obj)
2 扩展运算符:{ ...obj}
3 function shadowExtend(obj) {
     let newObj = {}

     for (let key in obj) {
        if (!newObj[key]) {
           newObj[key] = obj[key]
        }
     }
     return newObj
 }
深拷贝
1 let s = JSON.parse(JSON.stringify(obj))(但是如果里面有 function 和 undefined 不可用)
2 function  deepClone(data) {
     const type = this.judgeType(data);
     let obj;
     if (type === 'array') {
        obj = [];
     } else if (type === 'object') {
        obj = {};
     } else {
        // 不再具有下一层次
        return data;
     }
     if (type === 'array') {
        // eslint-disable-next-line
        for (let i = 0, len = data.length; i < len; i++) {
           obj.push(this.deepClone(data[i]));
        }
     } else if (type === 'object') {
        // 对原型上的方法也拷贝了....
        // eslint-disable-next-line
        for (const key in data) {
          obj[key] = this.deepClone(data[key]);
        }
      }
      return obj;
 }


 function  judgeType(obj) {
    // tostring会返回对应不同的标签的构造函数
    const toString = Object.prototype.toString;
    const map = {
       '[object Boolean]': 'boolean',
       '[object Number]': 'number',
       '[object String]': 'string',
       '[object Function]': 'function',
       '[object Array]': 'array',
       '[object Date]': 'date',
       '[object RegExp]': 'regExp',
       '[object Undefined]': 'undefined',
       '[object Null]': 'null',
       '[object Object]': 'object',
    };
    if (obj instanceof Element) {
       return 'element';
    }
    return map[toString.call(obj)];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值