JavaScript 深拷贝 递归 手写

今天的学习笔记写在了自己的网页笔记本上,没有记录到博客,但是学到一个有关深拷贝的实现方法,为加深印象,这里给大家分享一下:
深拷贝:就是拷贝到最底层的属性。

function deepCopy(object){		//这里传入一个拷贝的对象
	/*这里定义一个返回的新对象,也就是拷贝完成后的对象*/
	let newObject = Array.isArray(object) ? []: {};  // 首先定义对象类型,如果传入的是数组,则定义一个空数组,如果是对象,则定义一个空对象
	if(object && typeof(object) === 'object'){  //这里再次判断他是一个对象,是则继续进行操作
		for(key in object){		//在这里遍历他的属性,并接着判断属性是不是一个对象类型
			if(object.hasOwnProperty(key)){  //如果对象却是有这个属性,接着操作
				if(object[key] && typeof(object[key]) === 'object'){  //如果说这个属性还是一个对象的话,
					newObject[key] = deepCopy(object[key]);//先拷贝这个属性,然后把这个对象在进行拷贝,进行一个递归,
				}else{		// 如果这个属性不是对象的话,则拷贝完成,直接赋属性
					newObject[key] = object[key];
				}
			}
		}
	}
	return newObject; //最后把这个新对象返回出去
}
/*进行一个数组测试测试*/
let a = [1,2,3,4]; 
let obj = new Object();
let b = deepCopy(a);
a[0] = 10;
console.log(a,b); // => a=[10,2,3,4],b=[1,2,3,4];b的值没改变,说明实现了深拷贝
/*进行一个对象测试测试*/
let obj1 = new Object({name: '屠永涛'});
let obj2 = deepCopy(obj1);
obj1.name = '小屠永涛';
console.log(obj1.name,obj2.name);// obj1.name:小屠永涛,obj2.name:屠永涛说明实现了深拷贝

写完之后个人觉得还差点东西,如果传入的不是数组或对象呢,这时候该怎么抛出异常呢? 我尝试了一下,如果传入的是一个普通数据类型,如 Number,那么最后他会返回一个空对象,那么我尝试修改一下,先进行一个判断再操作,希望大家多指教,

function deepCopy(object){		//这里传入一个拷贝的对象
				if (object && typeof(object) === 'object') {  // **这里加了一个判断**
					/*这里定义一个返回的新对象,也就是拷贝完成后的对象*/
					let newObject = Array.isArray(object) ? []: {};  // 首先定义对象类型,如果传入的是数组,则定义一个空数组,如果是对象,则定义一个空对象
					if(object && typeof(object) === 'object'){  //这里再次判断他是一个对象,是则继续进行操作
						for(key in object){		//在这里遍历他的属性,并接着判断属性是不是一个对象类型
							if(object.hasOwnProperty(key)){  //如果对象却是有这个属性,接着操作
								if(object[key] && typeof(object[key]) === 'object'){  //如果说这个属性还是一个对象的话,
									newObject[key] = deepCopy(object[key]);//先拷贝这个属性,然后把这个对象在进行拷贝,进行一个递归,
								}else{		// 如果这个属性不是对象的话,则拷贝完成,直接赋属性
									newObject[key] = object[key];
								}
							}
						}
					}
					return newObject; //最后把这个新对象返回出去
				} else{
					alert("您输入的数据无法进行深拷贝");
				}
				
			}

谢谢大家耐心的读解。

发布了18 篇原创文章 · 获赞 44 · 访问量 3682

猜你喜欢

转载自blog.csdn.net/qq_44758322/article/details/105692361