今天的學習筆記寫在了自己的網頁筆記本上,沒有記錄到博客,但是學到一個有關深拷貝的實現方法,爲加深印象,這裏給大家分享一下:
深拷貝:就是拷貝到最底層的屬性。
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("您輸入的數據無法進行深拷貝");
}
}
謝謝大家耐心的讀解。