0
点赞
收藏
分享

微信扫一扫

深拷贝面试题

心如止水_c736 2022-04-06 阅读 114

前言

深拷贝 面试官最喜欢考的题


一、深拷贝是什么?

  • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象

JSON.parse(JSON.stringify());实现深拷贝

我们一般用来深拷贝, 就是利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象,这种写法非常简单,而且可以应对大部分的应用场景,但是它还是有很大缺陷的,比如拷贝其他引用类型、拷贝函数、循环引用等情况。显然,面试时你只说出这样的方法是一定不会合格的。

、实现深拷贝

  1. 能遍历对象或数组         for in
  2. 判断是不是原始值         typeof() object
  3. 判断是数组还是对象      instanceof toString constructor
  4. 建立对应的数组或对象  [] || {}
  5. 递归 原函数 重复 以上步骤

		function deepClone(origin, target = {}) {
			//我们使用toString来判断是数组还是对象 这里向保存一下不然太长影响代码
			let toStr = Object.prototype.toString
			let arrStr = '[object Array]'

			// for in 可以遍历数组或对象
			for (const pro in origin) {
				// 防止将原型上面的属性添加到target上
				if (origin.hasOwnProperty(pro)) {
					// 使用typeof判断是不是引用值 
					// origin[pro] !== null 防止将null值添加
					if (typeof origin[pro] === 'object' && origin[pro] !== null) {
						// toStr.call(origin[pro]) === arrStr 如果为true 代表数组 false为对象
						(toStr.call(origin[pro]) === arrStr) ? target[pro] = [] : target[pro] = {}
						// 递归 原函数 重复 以上步骤
						deepClone(origin[pro], target[pro])
					} else {
						// if (origin[pro] === null) {
						// 	continue
						// } else {
						// 	target[pro] = origin[pro]
						// }
						// 此地方等同上面if 当是三目运算必须表达式所以这里放了个true
						//递归的出口
						origin[pro] === null ? true : target[pro] = origin[pro]
					}
				}
			}
			return target
		}

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

toString() 方法返回一个表示该对象的字符串。

递归 (必须要出口)

程序调用自身的编程技巧称为递归( recursion)。递归作为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

测试

let obj = {
			name: '祁纤',
			person: [20, '男', { demo: { name: '沉香', age: '18' } }, null],
			obj: {
				sex: '男',
				age: 20,
				bar: ['red', 'bule']
			}
		}

		let bar = {}
		deepClone(obj, bar)
		bar.person.push('我@bar变了')
		console.log('@bar', bar)
		console.log('@obj', obj)

可以看出当我们给bar添加元素的时候 obj里面的person没有跟着改变也没将里面null拷贝过来

 所以我们便成功的完成了深拷贝。


总结

深拷贝在我们用的很多 大家一定要会哦 一般场景JSON.parse(JSON.stringify())便可以实现

举报

相关推荐

0 条评论