递归方法实现引用类型深拷贝

<template>
    <div>深拷贝</div>
</template>
<script>
export default {
    created () {
        let worker = {
            name:"Mr.Huang",
            age:18,
            car:[
                {
                    type:"bengchi",
                    num:1
                },
                {
                    type:"gaidilake",
                    num:1
                }
            ],
            wife:"beautiful"
        }
        let real = this.deepClone(worker)
        real.car[0].num=2
        console.log(worker,real);
    },
    methods: {
        //判断数据类型
        judgeType(value){
            return Object.prototype.toString.call(value).slice(8, -1);
        },
        //递归实现深拷贝
        deepClone(oldVal){
            let t = this
            //判断类型,如果不是引用类型,直接返回
            if(typeof(oldVal) !== 'object'){
                return oldVal
            }
            //根据接收到的参数判断生成一个新的引用类型数组还是对象
            let newVal = this.judgeType(oldVal)===Array?[]:{}
            if(t.judgeType(oldVal)===Array){//数组类型
                for(let key in oldVal){
                    if(typeof(oldVal[key])==='object'){
                        newVal[key]=t.deepClone(oldVal[key])//在这里递归,记得需要用新的引用类型去接收
                    }else{
                        newVal[key]=oldVal[key]
                    }
                }
            }else{
                for(let key in oldVal){//对象类型
                    if(oldVal.hasOwnProperty(key)){//hasOwnProperty(propertyName)方法 是用来检测属性是否为对象的自有属性,如果是,返回true,否者false; 参数propertyName指要检测的属性名;
                        if(typeof(oldVal[key])=='object'){
                            newVal[key]=t.deepClone(oldVal[key])
                        }else{
                            newVal[key]=oldVal[key]
                        }
                    }
                }
            }
            return newVal
        }
    }
}
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值