js的深拷贝和浅拷贝常用方法

本文深入探讨了浅拷贝与深拷贝的区别,通过实例演示了使用Object.assign(), 解构赋值, JSON.stringify及递归方法实现拷贝的过程,并分析了不同方法在处理复杂数据结构时的局限性和适用场景。

**

一 浅拷贝

**

(1) Object.assign()

var obj1 = {a: 1, b: 2}
 
var obj2 = Object.assign({}, obj1)
 
obj2.a = 4
 
console.log(obj1, obj2)
// {a: 1, b: 2}, 
// {a: 4, b: 2}

(2) 解构赋值

var obj1 = {a: 1, b: 2}
 
var obj2 = {...obj1}
 
obj2.a = 4
 
console.log(obj1, obj2)
// {a: 1, b: 2}, 
// {a: 4, b: 2}

但这两种拷贝有一个问题就是只能赋值一层,假设我们有如下数据结构

var obj1 = [{
    name: 'Bob',
    childs: ['kimi', 'giao']
}]
 
var obj2 = [...obj1]
 
obj2[0].childs = []
 
console.log(obj1, obj2)

在这里插入图片描述
**

二、深拷贝

**

(1) 利用json.stringify

var obj1 = [{
    name: 'Bob',
    childs: ['kimi', 'giao']
}]
 
var obj2 = JSON.parse(JSON.stringify(obj1))
 
obj2[0].childs = []
 
console.log(obj1, obj2)

在这里插入图片描述

var obj1 = [{
    name: 'Bob',
    childs: ['kimi', 'giao'],
    fn: function() {},
    age: undefined
}]
 
var obj2 = JSON.parse(JSON.stringify(obj1))
 
obj2[0].childs = []
 
console.log(obj1, obj2)

在这里插入图片描述
我们从结果中发现,值为undefined,或者function的时候并不会拷贝过来。

(2) 利用递归来实现一个方法进行拷贝

var obj1 = [{
    name: 'Bob',
    childs: ['kimi', 'giao'],
    fn: function() {},
    age: undefined
}]
 
var obj2 = extend(obj1)
 
obj2[0].childs = []
 
console.log(obj1, obj2)
 
function extend(data) {
    if (typeof data === 'object' && data) {
        let val = typeof data.length === 'number' ? [] : {}
        for(let i in data) {
            val[i] = extend(data[i])
        }
        return val
    } else {
        return data
    }
}

在这里插入图片描述

(3)利用loadsh的封装方法_.cloneDeep方法实现(代码略)

*

总结

拷贝的目的就是我在拷贝你之后,我和你长得一样,但是又不会影响你

通俗的讲浅拷贝只能拷贝一层(改变这一层不会相互影响),如果遇到基本数据类型直接拷贝,遇到引用类型数据就拷贝地址,例如对象obj => {a:{c:1}, b:666}实行浅拷贝后得到对象obj1,如果obj1修改b或a属性不会影响obj的b或a属性,但是如果obj1修改a.c属性会改变obj的a.c属性,深拷贝就是全部复制,二者所有层数永远独立不会相互影响

JavaScript中,深拷贝浅拷贝是两种常用的对象拷贝方法浅拷贝是按位拷贝对象,创建一个新对象,并将原始对象的属性值精确拷贝到新对象中。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址。因此,如果其中一个对象改变了这个地址,就会影响到另一个对象。\[3\] 深拷贝是将原始对象及其所有嵌套对象的属性值都进行拷贝,创建一个全新的对象。深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象它所引用的对象一起拷贝时即发生深拷贝深拷贝相比于浅拷贝速度较慢并且花销较大。\[2\] 在JavaScript中,实现深拷贝方法有以下几种: 1. 通过递归的方式实现深拷贝,可以使用jQuery中的extend方法来实现。这种方法会递归地遍历对象的所有属性,并进行拷贝。\[1\] 2. 使用JSON.parse()JSON.stringify()方法来实现深拷贝。首先将对象转换为JSON字符串,然后再将JSON字符串转换为新的对象。这种方法可以实现简单的深拷贝,但是对于包含函数、正则表达式等特殊类型的对象可能会出现问题。\[1\] 3. 使用第一种方法中的递归方式来实现深拷贝。这种方法需要自己编写递归函数来遍历对象的所有属性,并进行拷贝。\[1\] 总结起来,深拷贝是将原始对象及其所有嵌套对象的属性值都进行拷贝,创建一个全新的对象,而浅拷贝只是按位拷贝对象,创建一个新对象,并将原始对象的属性值精确拷贝到新对象中。在JavaScript中,可以通过递归方式、JSON.parse()JSON.stringify()方法等来实现深拷贝。 #### 引用[.reference_title] - *1* [JavaScript浅拷贝(三种方法)](https://blog.youkuaiyun.com/weixin_46022934/article/details/121415082)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [js实现浅拷贝深拷贝](https://blog.youkuaiyun.com/ab_er/article/details/126009166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值