JS递归+Object.assign实现深拷贝

我自己研究的JS深拷贝函数,大家看看可靠吗

函数源码,考虑对象、函数、symbol特殊处理一下,其他直接返回原始值

		function deepClone(obj){
		    let newObj
		    if(typeof obj==='object'&&obj!==null){
		        if(obj instanceof Array){
		            newObj= obj.map(item=>deepClone(item))
		        }else{
		             newObj=Object.assign({},obj)
		        }
		        for (const key in obj){
		            if(obj.hasOwnProperty(key)){
		                newObj[key]= deepClone(obj[key])
		            }
		        }
		    }else if(typeof obj==='function'){
		        let fnBody=[]
		        fnBody= obj.toString().match(/\((.+)\)\{(.+)\}$/)
		        const args=fnBody.slice(1,fnBody.length-1)
		        newObj=new Function(args,fnBody[fnBody.length-1])
		        for (const key in obj){
		            if(obj.hasOwnProperty(key)){
		                newObj[key]= deepClone(obj[key])
		            }
		        }
		    }else if(typeof obj==='symbol'){
		        newObj=Symbol(obj.toString().match(/\((.+)\)/)[1])
		    }else{
		        return obj
		    }
		    return newObj
		}

下面是测试代码

		let obj={
		    name:'tom',
		    arr:[
		        {age:18},
		        {gender:'nan'},
		        {level:2},
		        {fn:function(a){console.log('1')},name:'jj'},
		        null,
		        undefined
		    ],
		    level:1
		}
		obj.arr[3].fn.namea='ff'
		const newObj1=deepClone(obj)
		obj.arr[3].fn.namea='aa'
		obj.arr[4]={four:4}
		obj.arr.count=5
		
		console.log(obj)
		console.log(newObj1)
		console.log(obj.arr[3].fn.namea)
		console.log(newObj1.arr[3].fn.namea)

输出如下:

		//obj
		{
		  name: 'tom',
		  arr: [
		    { age: 18 },
		    { gender: 'nan' },
		    { level: 2 },
		    { fn: [Function], name: 'jj' },
		    { four: 4 },
		    undefined,
		    count: 5
		  ],
		  level: 1
		}
		//newObj
		{
		  name: 'tom',
		  arr: [
		    { age: 18 },
		    { gender: 'nan' },
		    { level: 2 },
		    { fn: [Function], name: 'jj' },
		    null,
		    undefined
		  ],
		  level: 1
		}
		//obj.arr[3].fn.namea函数属性
		aa
		//newObj.arr[3].fn.namea函数属性
		ff

我测试起来倒是没有什么问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值