js深拷贝

js无法拷贝特殊数据类型

js解决在使用其他的对象深拷贝时出现的,无法拷贝特殊的数据类型,例如:Map() , Set().

var obj = {
	a: new Map(),
	b: new Set()
}
function deepClone(target) {
	    const map = new WeakMap()
	    
	    function isObject(target) {
	        return (typeof target === 'object' && target ) || typeof target === 'function'
	    }
	
	    function clone(data) {
	        if (!isObject(data)) {
	            return data
	        }
	        if ([Date, RegExp].includes(data.constructor)) {
	            return new data.constructor(data)
	        }
	        if (typeof data === 'function') {
	            return new Function('return ' + data.toString())()
	        }
	        const exist = map.get(data)
	        if (exist) {
	            return exist
	        }
	        if (data instanceof Map) {
	            const result = new Map()
	            map.set(data, result)
	            data.forEach((val, key) => {
	                if (isObject(val)) {
	                    result.set(key, clone(val))
	                } else {
	                    result.set(key, val)
	                }
	            })
	            return result
	        }
	        if (data instanceof Set) {
	            const result = new Set()
	            map.set(data, result)
	            data.forEach(val => {
	                if (isObject(val)) {
	                    result.add(clone(val))
	                } else {
	                    result.add(val)
	                }
	            })
	            return result
	        }
	        const keys = Reflect.ownKeys(data)
	        const allDesc = Object.getOwnPropertyDescriptors(data)
	        const result = Object.create(Object.getPrototypeOf(data), allDesc)
	        map.set(data, result)
	        keys.forEach(key => {
	            const val = data[key]
	            if (isObject(val)) {
	                result[key] = clone(val)
	            } else {
	                result[key] = val
	            }
	        })
	        return result
	    }
	    return clone(target)
	}
console.log(deepClone(obj))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值