JS深拷贝方法

一、递归遍历实现深拷贝

//判断传入的数据类型并进行深拷贝
@param(target) // 需要拷贝的目标参数
export const deepClone = target => {
    //定义一个变量
    let result
    //如果当前需要深拷贝的是一个对象
    if(typeof target === 'object') {
        //如果是一个数组
        if (Array.isArray(target)) {
            result = [ ]
            for (const i in target) {
                //递归克隆数组中的每一项
                result.push(deepClone(targer[i]))
            }
        } else if (target === null) {
            //判断当前值是null的话,直接赋值为null
        } else if ( target.construcror === EegExp) {
            result = target
        } else {
            // 否则为普通对象,直接for in 循环,递归赋 值对象的所有值
            result = { }
            for (const i in target) {
                 result[i] = (deepClone(targer[i]))
            }
        }
    } else {
        result = target
    }
    return result
}

二、JSON.parse(JSON.stringify(xxx))

(有局限性,如果有undefined、null。会丢失)

function deepClone (obj) {
  let _obj = JSON.stringify(obj)
  let objClone = JSON.parse(_obj)
  return objClone
}
 
let a = [0,1,[2,3],4]
let b = deepClone(a)
a[0] = 1  
a[2][0] = 1  // [1,1,[1,3],4]
b  // [0,1,[2,3],4]

三、JQ的extend方法

$.extend([deep ], target, object1 [, objectN ])

deep表示是否深拷贝,为true为深拷贝;为false,为浅拷贝。

target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。

object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。

let a = [0,1,[2,3],4]
let b = $.extend(true, [], a)
a[0] = 1
a[2][0] = 1  // [1,1,[1,3],4]
b  // [0,1,[2,3],4]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老电影故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值