js中浅拷贝和深拷贝(复制数组或复制对象)

2023-01-30  本文已影响0人  默默无闻的小人物

前言

*在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示: *

image

如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不是我们所需要的结果。
因此,数组以及对象的深拷贝就是javascript的一个基本功了。

ps:要实现完全的深层次拷贝,既拷贝所有层级的属性。并且不会丢失数据。只有一种方法,那就是递归遍历所有层。

function deepCopy(obj) {
    let clonedObj;
 
    // 判断直接数据类型
    if (['number', 'string', 'boolean', 'undefined', 'symbol',].includes(typeof obj)
        || obj === null) {
        clonedObj = obj;
        return clonedObj;
    }
 
 
    const constructor = obj.constructor || Object;
    clonedObj = new constructor();
 
 
    Object.entries(obj).forEach(([key, value]) => {
        clonedObj[key] = deepCopy(value);
    })
 
 
    return clonedObj;
}

可能很多人说有很多方法啊,JSON.stringify然后再JSON.parse,这个方法其实也是深拷贝,但是有如下风险

  • 1、如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式,而不是对象的形式
  • 2、如果obj里面有RegExp,则打印出来是空对象
  • 3、如果对象中有函数或者undefined,则会直接被丢掉
  • 4、如果json里有对象是由构造函数生成的,则会丢掉对象的constructon
  • 5、如果对象中存在循环引用的情况也无法正确实现深拷贝
  • 6、如果对象中存在NAN,则序列化后会变成null
上一篇 下一篇

猜你喜欢

热点阅读