JS自定义深浅度克隆

function deepClone(obj, cache = new WeakMap()) {
	if (typeof obj !== 'object') return obj //普通类型,直接返回
	if (obj === null) return obj
	if (cache.get(obj)) return cache.get(obj)//防止循环引用,程序进入死循环
	if (obj instanceof Date) return new Date(obj)//返回时间格式
	if (obj instanceof RegExp) return new RegExp(obj)//返回正则
	if (typeof obj === 'symbol') return Symbol(obj.description)	// 处理 Symbol
	//找到所属原型上的constructor,所属原型上的constructor指向点前对象的构造函数
	let cloneObj = new obj.constructor()
	// console.log(cloneObj)
	cache.set(obj, cloneObj)//缓存拷贝的对象,用于处理循环引用的情况
		for (let key in obj) {
		//hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
			if (obj.hasOwnProperty(key)) {
				// console.log(key)
					cloneObj[key] = deepClone(obj[key], cache)//递归拷贝
			}
		}
		return cloneObj
	}

	//测试
	const obj = { name: 'Jack', address: { x: 100, y: 200 }, a: [1, 2, 3, 4], b: Symbol('22') }
	obj.a = obj//循环引用,会一直嵌套
	const newObj = deepClone(obj)
	console.log('obj', obj)
	console.log('newObj', newObj) 

你可能感兴趣的:(javascript,前端)