鍍金池/ 問答/HTML/ js淺復(fù)制的新對(duì)象屬性

js淺復(fù)制的新對(duì)象屬性

問題描述

淺復(fù)制是復(fù)制引用,復(fù)制后的引用都是指向同一個(gè)對(duì)象的實(shí)例,彼此之間的操作會(huì)互相影響,下面例子中我新建一個(gè)obj對(duì)象,然后淺復(fù)制了一個(gè)新對(duì)象newObj出來,為什么我操作obj里面的數(shù)組arr,新對(duì)象newObj會(huì)有變化,而我直接修改obj.name屬性,新對(duì)象newObj卻沒有變化,

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

相關(guān)代碼

//淺復(fù)制
                function simpleClone(obj){
                   var simpleCloneObj = {};
                   for(var item in obj){
                     simpleCloneObj[item] = obj[item]  
                   }
                   return simpleCloneObj
                }
                
                var obj = {
                  name:"dabao",
                  age:28,
                  arr:[1,3,5]
                }
                
                var newObj = simpleClone(obj);
                
                obj.arr.push(0);
                obj.name = 'hello';
                console.log(newObj);
                console.log(obj);

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

我理解的淺復(fù)制,是新對(duì)象被淺復(fù)制出來后,原對(duì)象的屬性值得改變都會(huì)在復(fù)制出來的新對(duì)象里面有體現(xiàn),不知道為什么屬性沒有變化?

回答
編輯回答
夢(mèng)若殤

1.首先,你在simpleClone()這個(gè)函數(shù)里創(chuàng)建了一個(gè)新對(duì)象,newObj和初始的obj指向的是兩個(gè)地址;
2.原始o(jì)bj的name和age是原始類型=操作的時(shí)候是賦值的真真正正的值,arr是一個(gè)引用類型,當(dāng)執(zhí)行=操作的時(shí)候,是把原始o(jì)bj的arr的地址復(fù)制給了newObj的arr屬性。
3.所以name和age與原來沒有關(guān)聯(lián)了,而arr還與原來的obj還是指向的同一份數(shù)據(jù)的地址

2017年12月9日 10:24
編輯回答
傻丟丟

你寫的方法相當(dāng)于 newObj.name = obj.name
name,age是字符串,數(shù)字 是基本類型 所以復(fù)制的是值不是引用
arr不是基本類型 所以復(fù)制的是引用

想實(shí)現(xiàn)你說的 修改一個(gè)改變另一個(gè) 直接 newObj = obj 就行了

2017年5月15日 21:32
編輯回答
避風(fēng)港

因?yàn)閚ame是一個(gè)值不是一個(gè)引用,淺復(fù)制是指:

let p={
    name:"123",
    ch:[1,2,3,4],
}

let k= p;
k.name="456"
//此時(shí)p.name也會(huì)變成456

如圖:clipboard.png

而在你的simple Clone這個(gè)函數(shù)當(dāng)中,你并沒有對(duì)這個(gè)對(duì)象進(jìn)行操作,而是操作了對(duì)象的屬性。
對(duì)于其中的某一個(gè)屬性進(jìn)行了復(fù)制,這就相當(dāng)于

let a = "123";
let b = a;
b = "456";
//不會(huì)影響a

當(dāng)然,如果這個(gè)屬性本身還是一個(gè)引用的話比如數(shù)組或者對(duì)象,那么他才會(huì)依然是一個(gè)淺復(fù)制

2018年1月29日 20:03
編輯回答
伐木累

屬性沒有變化,是因?yàn)閷傩灾凳菍儆?strong>值類型的變量,而數(shù)組和對(duì)象都是屬于引用類型的變量,其實(shí)深復(fù)制和淺復(fù)制都是圍繞內(nèi)存地址這個(gè)問題來進(jìn)行的,而內(nèi)存地址和變量的屬性(引用類型還是值類型)是分不開的。你的方法,循環(huán)復(fù)制里面,arr是個(gè)數(shù)組,賦值也只是把內(nèi)存地址賦值過去了,真正的值并沒有賦值過去。
你這種復(fù)制方法,雖然循環(huán)了一層,但是還是屬于淺復(fù)制,真正深復(fù)制請(qǐng)參考jQuery的$.extend方法,遞歸的去復(fù)制,這才是真正的深復(fù)制。

2017年11月1日 23:50