js浅拷贝以及深拷贝

深拷贝和浅拷贝是在JS中经常使用的概念,用于描述对象或数组等引用类型的复制。

浅拷贝只是复制了原始对象的引用,而不是复制实际的值。因此,当修改副本时,原始对象的相应值也会改变。

深拷贝是将原始对象的所有值都复制到新对象中,而不是仅仅复制引用。因此,修改副本不会影响原始对象。

在JS中,可以使用以下几种方法来进行深拷贝或浅拷贝:

浅拷贝:

1、Object.assign()方法

let obj1 = { a: 1, b: 2 };
let obj2 = Object.assign({}, obj1);

2、扩展操作符

let obj1 = { a: 1, b: 2 };
let obj2 = { ...obj1 };

3、数组的slice()、concat()方法

let arr1 = [1, 2, 3];
let arr2 = arr1.slice(); // 或者arr1.concat()

深拷贝:

1、JSON.parse()和JSON.stringify()方法(适用于没有函数、日期等特殊类型的对象)

let obj1 = { a: 1, b: 2 };
let obj2 = JSON.parse(JSON.stringify(obj1));

2、lodash库中的_.cloneDeep()方法(适用于所有类型的对象)

let obj1 = { a: 1, b: { c: 2 } };
let obj2 = _.cloneDeep(obj1);

3、自己封装

    const obj = {
        name: 'longge',
        age: 16,
        arr: [],
        o: { a: 1, b: 2 },
        f: function () {},
        c: undefined,
        d: new Date(),
      }

    function deepClone(obj) {
        //如果对象为null或者undefined,直接返回
        if (obj == null) return obj 

        //如果对象是Date类型,创建一个新的Date对象并返回
        if (obj instanceof Date) return new Date(obj) 

        //如果是简单数据类型,直接返回
        if (typeof obj !== 'object') return obj 

        // 如果obj 是对象或数组
        //创建一个新的空对象或数组,使用与原对象相同的构造函数
        const newObj = new obj.constructor() 

        // 遍历原对象的属性
        for (let k in obj) { 
        // 递归调用deepClone函数,对属性值进行深拷贝
          newObj[k] = deepClone(obj[k]) 
        }
        return newObj //返回克隆后的新对象
      }
      const newObj = deepClone(obj)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值