原生js深拷贝

JavaScript有6种基本数据类型 字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(es6引入的一种原始数据类型 表示独一无二)。和3种引用数据类型 对象(Object)、数组(Array)、函数(Function)。

对于引用数据类型 当赋值时会引用同一数据地址 例如:

我们会发现 当改变arr1 数组里面的值的时候也会影响到arr数组的内容。当我们想拷贝一个数组的时候又不想改变原有数组的值 这时候就要深入拷贝

假设我们需要拷贝一个这样的对象

我们要拷贝一个这样的对象的思路

1.循环对象上的属性

2.判断这个属性是本地属性还是继承与prototype对象的属性如果是本地属性则是我们想要拷贝的属性

3.判断这个属性时什么数据类型

4.如果是原始数据类型 那么选择直接拷贝

5.如果是引用数据类型 判断这个引用数据类型是 对象 还是 数组 然后 重复步骤1

话不多说直接上代码

function DeepClone(origin, target) {
        var target = target || {}
        const toStr = Object.prototype.toString//后面判断一个引用值是数组还是一个对象
        const arrStr = "[object Array]"//如果一个引用值是一个数组
        for (let prop in origin) {
            if (origin.hasOwnProperty(prop)) {
                if (typeof origin[prop] == 'object') {
                    if (toStr.call(origin[prop]) == arrStr) {
                        target[prop] = []
                    } else {
                        target[prop] = {}
                    }
                    DeepClone(origin[prop], target[prop])
                } else {
                    target[prop] = origin[prop]
                }
            }
        }
    }

测试

当我们改变obj1 里面的内容的时候 发现obj里面的内容不发生改变 那么一个简单的深拷贝就写好了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值