題目要求
實(shí)現(xiàn)一個函數(shù)clone,可以對JavaScript中的5種主要的數(shù)據(jù)類型(包括Number、String、Object、Array、Boolean)進(jìn)行值復(fù)制
代碼
function clone(data){
if(Array.isArray(data)){
//引用數(shù)據(jù)類型:Array
let newArr = [];
for(let i in arr){
newArr[i] = clone(data[i]);
}
return newArr;
}else if(data instanceof Object) {
//引用數(shù)據(jù)類型:Object
let newObj = {};
for(let key in data){
newObj[key] = clone(data[key]);
}
return newObj;
}else{
//基礎(chǔ)數(shù)據(jù)類型
return data;
}
}
代碼分為三種情況
1.Object的復(fù)制“
//復(fù)制對象obj
const obj = {name: 'yujuan',hobbies:{outgoing:"play",indoor:"sing"}};
2.Array的復(fù)制:
//復(fù)制數(shù)組arr
const arr = [1,2,3,4];
這兩種情況中為什么要遞歸調(diào)用clone()函數(shù)呢,是為了避免直接復(fù)制引用,舉個例子
let obj1 = new Object();
let obj2 = obj1;
obj1.name = "Mary";
alert(obj2.name);//"Mary"
首先,obj1保存了對象的一個新實(shí)例,然后這個值被復(fù)制到obj2中,那么此時obj2就和obj1指向堆內(nèi)存的同一個對象

所以我們不能直接復(fù)制引用,而是應(yīng)該新建一個空對象,然后將值復(fù)制給空對象,切記不是復(fù)制引用。
3.基礎(chǔ)數(shù)據(jù)類型比如Number、String、Boolean的復(fù)制,這個最簡單,直接返回就好
有不懂的地方歡迎留言~
每天都努力一點(diǎn)點(diǎn)
謝謝你看完