在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

問題描述

淺復(fù)制是復(fù)制引用,復(fù)制后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響,下面例子中我新建一個obj對象,然后淺復(fù)制了一個新對象newObj出來,為什么我操作obj里面的數(shù)組arr,新對象newObj會有變化,而我直接修改obj.name屬性,新對象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é)果是什么?實際看到的錯誤信息又是什么?

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

回答
編輯回答
夢若殤

1.首先,你在simpleClone()這個函數(shù)里創(chuàng)建了一個新對象,newObj和初始的obj指向的是兩個地址;
2.原始o(jì)bj的name和age是原始類型=操作的時候是賦值的真真正正的值,arr是一個引用類型,當(dāng)執(zhí)行=操作的時候,是把原始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ù)制的是引用

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

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

因為name是一個值不是一個引用,淺復(fù)制是指:

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

let k= p;
k.name="456"
//此時p.name也會變成456

如圖:clipboard.png

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

let a = "123";
let b = a;
b = "456";
//不會影響a

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

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

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

2017年11月1日 23:50