JS傳值和傳址問題(JS深拷貝)

當(dāng)我們?cè)谑褂肑S進(jìn)行賦值時(shí),進(jìn)行簡(jiǎn)單類型的賦值,只會(huì)改變變量的值,而不會(huì)改變變量的地址,例如:

let a =10
let b = a
b = 20

此時(shí)改變b的值,a的值是不會(huì)收到影響的。
而當(dāng)我們進(jìn)行復(fù)雜類型賦值時(shí),例如:

let a = {
  "name" : a,
  "age" : 18
}
let b = a 
b.name = "b"

此時(shí)我們b中的name值改變了,與此同時(shí)a中的name值也將變成b,大多數(shù)情況下我們都不希望這種情況發(fā)生,那么該怎么處理?
(ps:簡(jiǎn)單數(shù)據(jù)類型一般包括number,string,boolean,其他數(shù)據(jù)類型一般都為復(fù)雜數(shù)據(jù)類型)

處理這個(gè)問題涉及到JS中的深拷貝,JS的深拷貝會(huì)為新的變量重新申請(qǐng)一個(gè)新的地址塊,不會(huì)指向原變量的地址,如何實(shí)現(xiàn)深拷貝,以下提供了兩種方法。

方法一:

let a = {
      "name" : a,
      "age" : 18
 }
let b = JSON.parse(JSON.stringify(a))

將a進(jìn)行序列化之后賦值給b,這種方法雖然簡(jiǎn)單,但是有一定的缺陷,如果a對(duì)象中有函數(shù),數(shù)組等復(fù)雜數(shù)據(jù)類型,在序列化之后將會(huì)丟失這些復(fù)雜數(shù)據(jù)類型,導(dǎo)致賦值不完全。

方法二:

//深拷貝
let a = {
  "name" : a,
  "age" : 18,
  arr : [],
  fn : function(){
    console.log('fn')
  }
}

function deepCopy(obj){
  let newObj = Array.isArray(obj)?[]:{}//判斷傳過來(lái)的對(duì)象是對(duì)象還是數(shù)組
  for (let key in obj){
    if(obj.hasOwnProperty(key)){
       if(typeof(obj[key]) === Object){
        newObj[key] = deepCopy(obj[key])//如果循環(huán)到的屬性本身還是對(duì)象,進(jìn)行遞歸處理
        }else{
          newObj[key] = obj[key]
        }
    }
  }
  return newObj
}
let b = deepCopy(a)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容