今天碰到一個(gè)有意思的問題鸽嫂,在一個(gè)函數(shù)中對(duì)形參做了改變之后米罚,導(dǎo)致實(shí)參的值發(fā)生了變化,原先并沒有注意相满,今天偶然觸發(fā)(所以代碼要規(guī)范啊.......)层亿,直接上代碼。
代碼
demo1
function test1(param){
param = 3;
}
var x = 1;
test(x);
console.log(x); // x = 1
demo2
function test2(param){
param.name = "aven";
}
var persion = {
name:"ake",
age:18
};
test2(persion);
console.log(persion); //{name:"aven",age:18}
問題
一樣的套路立美,但是結(jié)果不同匿又,demo1沒有改變傳入的實(shí)參變量,demo2改變了傳入的實(shí)參變量建蹄。
差別就在于demo1中碌更,參數(shù)為簡單數(shù)據(jù)類型(null,undefined,boolean,number,string),demo2中為復(fù)雜數(shù)據(jù)類型(object洞慎,typeof([]) === 'object')痛单。
解決
那么要想對(duì)復(fù)雜數(shù)據(jù)類型進(jìn)行傳參后的處理應(yīng)該怎么辦?
簡單實(shí)現(xiàn)一個(gè)deepClone
deepClone
function deepClone(obj) {
const tempObj = {};
let keys = Object.keys(obj);
keys.forEach(key => {
if (typeof obj[key] === 'object') {
if (Array.isArray(obj[key])) {
tempObj[key] = [].concat(obj[key]);
} else {
tempObj[key] = deepClone(obj[key])
}
} else {
tempObj[key] = obj[key];
}
});
return tempObj;
}
創(chuàng)建一個(gè)新Object劲腿,當(dāng)原Object的key所對(duì)應(yīng)value為簡單數(shù)據(jù)類型時(shí)揩晴,可以直接賦值給新Object辕棚,當(dāng)原Object的key所對(duì)應(yīng)value為復(fù)雜數(shù)據(jù)類型時(shí)荠呐,要對(duì)這個(gè)value遞歸使用deepClone方法篷店,不可以直接賦值給新Object。
引申
如何比較兩個(gè)復(fù)雜數(shù)據(jù)類型是否相等花椭?