用js写一个克隆对象的封装函数

//obj可以为数组对象函数原始类型,deep为true时候开启深度克隆。
		var clone = function(obj,deep){
			 if(Array.isArray(obj)){
			 	if(deep){
			 		var newArr = [];
			 		for(var i= 0;i < obj.length; i++){
			 			newArr.push(this.clone(obj[i],deep));
			 		}
			 		return newArr;
				}else{
			 		return obj.slice();//复制数组
			 	} 	
			 }
			 else if(typeof obj === "object"){
			 	var newObj = {};
			 	for(var prop in obj){
			 		if(deep){
			 			//deep为true开启深度克隆
			 			newObj[prop] = this.clone(obj[prop],deep);//递归
			 		}else{
			 			newObj[prop] = obj[prop];
			 		}
			 		
			 	}
			 	return newObj;
			 }
			 else{
			 	//函数、原始类型
			 	return obj;
			 }
		}

		var obj = {
			a:1,
			b:2,
			sonobj:{
				c:3,
				d:4,
			}
		}
		//看看深度克隆的作用
		var objclone1 = clone(obj);
		console.log(objclone1.sonobj === obj.sonobj); //true,浅克隆,地址不一样
		var objclone2 = clone(obj,true);
		console.log(objclone2.sonobj === obj.sonobj);//false,深度克隆,递归子对象也创建了新对象,地址不一样

		var array1 = [1,2,[3,4]];
		var arrayclone1 = clone(array1,true);
		var arrayclone2 = clone(array1);
		console.log(arrayclone1);//[1, 2, Array(2)]
		console.log(arrayclone2);//[1, 2, Array(2)]
		console.log(arrayclone1[2] === array1[2])//flase
		console.log(arrayclone2[2] === array1[2])//true
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我可以给你提供一些建议:首先,可以使用JavaScript内置的JSON.parse()和JSON.stringify()方法来实现深拷贝;其次,可以使用lodash或underscore等工具库中的深拷贝方法;最后,也可以自己编一个函数来实现深拷贝。 ### 回答2: 当然可以!以下是使用 JavaScript 封装一个深拷贝的方法: ```javascript function deepCopy(obj) { if (typeof obj !== 'object' || obj === null) { return obj; } let copy; if (Array.isArray(obj)) { copy = []; for (let i = 0; i < obj.length; i++) { copy[i] = deepCopy(obj[i]); } } else { copy = {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); } } } return copy; } // 示例用法 const originalObject = { name: "John", age: 30, hobbies: ["reading", "music"], address: { city: "New York", zipcode: "10001" } }; const copiedObject = deepCopy(originalObject); // 修改原始对象 originalObject.name = "Jane"; originalObject.hobbies.push("sports"); originalObject.address.city = "Los Angeles"; console.log(originalObject); /* 输出: { name: "Jane", age: 30, hobbies: ["reading", "music", "sports"], address: { city: "Los Angeles", zipcode: "10001" } } */ console.log(copiedObject); /* 输出: { name: "John", age: 30, hobbies: ["reading", "music"], address: { city: "New York", zipcode: "10001" } } */ ``` 代码中的 `deepCopy` 函数使用递归的方式实现深拷贝。它可以处理对象数组,并确保所有嵌套对象数组都被正确地复制,而不仅仅是复制引用。这样,在拷贝后对原始对象的修改将不会影响到深拷贝后的对象。 ### 回答3: 当然可以!以下是一个用 JavaScript 封装的深拷贝方法: ```javascript function deepCopy(obj) { if (typeof obj !== "object" || obj === null) { return obj; // 如果是基本类型或者null,直接返回 } let copy = Array.isArray(obj) ? [] : {}; // 根据类型创建新对象 Object.keys(obj).forEach((key) => { copy[key] = deepCopy(obj[key]); // 递归拷贝子对象 }); return copy; // 返回新对象 } ``` 这个方法可以处理对象及其嵌套的子对象,并返回一个全新的拷贝对象。如果拷贝的对象是基本类型或者 null,它将直接返回该值而不进行拷贝。 使用这个深拷贝方法只需调用 `deepCopy()` 函数并传入要拷贝的对象作为参数。例如: ```javascript let obj1 = { name: "小明", age: 20, hobbies: ["游泳", "看电影"], address: { country: "中国", city: "北京" } }; let obj2 = deepCopy(obj1); console.log(obj2); ``` 通过以上代码,`obj2` 将是 `obj1` 的一个全新拷贝,两个对象之间不会相互影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值