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("您輸入的數據無法進行深拷貝");
				}
				
			}

謝謝大家耐心的讀解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章