*?變量引用值才顿,
*?地址存儲值。
*?對象的拷貝:?將一個對象賦值給另外一個對象,?我們稱之為對象的拷貝
*?淺拷貝:?(只需要使用賦值運算符(=)即可)
原因:?淺拷貝只是對對象的引用地址進行了拷貝返奉,并沒有開辟新的堆棧,拷貝后吗氏,兩個對象指向的是同一個引用地址芽偏,所以修改其中一個對象的屬性,另一個對象的屬性也會改變弦讽。
????簡單來說就是?兩個變量?指向同一個?內(nèi)存地址污尉。所以一旦在?新變量?修改?變量值?,會影響被拷貝的原變量往产。因為他們指向同一個內(nèi)存地址被碗。
????code:?
????????var?ch?=?{
????????????name:?"chenhang",
????????????size:?"shou"
????????};
????????//將原對象直接賦值給新變量
????????var?ch2?=?ch;
????????ch2.name?=?"小基佬";
????????console.log(ch,?ch2);
*?深拷貝:?
????復(fù)制了一份內(nèi)存的值,同時開辟了一塊?新內(nèi)存?存放這個值仿村,值相同锐朴,但是內(nèi)存地址不相同。如果修改新變量的值蔼囊,不會對被拷貝的原變量產(chǎn)生影響焚志。
????code:
????????var?a?=?{
????????????name:?"zouhaohao",
????????????age:?"22",
????????????sex:?"boy"
????????}
????????//JSON.stringify?將對象轉(zhuǎn)化成字符串???JSON.parse?將字符串轉(zhuǎn)化成對象?
????????var?hh?=?JSON.parse(JSON.stringify(a));
????????hh.name??=?"聰明的小伙子";
????????console.log(a,?hh);
*?網(wǎng)上流傳Object.assign能夠?qū)崿F(xiàn)對象的深拷貝、slice和concat能夠?qū)崿F(xiàn)數(shù)組的深拷貝畏鼓,經(jīng)過測試酱酬,這些都只是披著深拷貝的外衣的淺拷貝。
????*?如何理解:?【披著深拷貝的外衣的淺拷貝】?云矫?
????????-?如果該對象屬性的值并沒有引用類型時膳沽,這三個方法均能實現(xiàn)深拷貝,實現(xiàn)對值的拷貝泼差。
????????-?一旦對象屬性的值為引用類型時贵少,只會對該值的引用地址進行拷貝。?這又回到了淺拷貝堆缘。
????????code:?
????????var?obj?=?{?age:?'11',?parent:?{?father:?'XX',?mother:?'XX'?}?};
????????var?newObj?=?Object.assign({},?obj);??//將obj中的參數(shù)復(fù)制到{}中滔灶,故參數(shù)順序不能反
????????obj.age?=?'12';
????????obj.parent['father']?=?'YY';?//對象里面的對象修改了。
????????console.log(obj);??????//?obj:?{?age:?'12',?parent:?{?father:?'YY',?mother:?'XX'?}?}?
????????console.log(newObj);???//?newObj:?{?age:?'11',?parent:?{?father:?'YY',?mother:?'XX'?}?實現(xiàn)了對obj對象的簡單屬性的深拷貝?但是對象的對象屬性確是淺拷貝吼肥。
????總結(jié)一下: MDN都說了Object.assign方法只會拷貝源對象自身的并且可枚舉的屬性到目標(biāo)對象录平。是用來合并對象的,人家拷貝的是屬性值缀皱,假如源對象的屬性值是一個對象的引用斗这,那么它也指向那個引用(這不是典型的淺拷貝的本質(zhì)嗎,指向同一個引用,即引用被修改了,指向所有該引用的所有屬性值都將修改.)
*?【如何實現(xiàn)真正的深拷貝】?
????1.?JSON.parse()
????????網(wǎng)上流傳的一個黑科技啤斗,使用var?newObj?=?JSON.parse(JSON.stringify(obj))可以實現(xiàn)對象的深拷貝表箭,但是該方法存在一些問題:
????????-?無法作用于函數(shù),RegExp特殊對象钮莲,不過對這些進行深拷貝免钻,我覺得并不需要彼水,如果有需要對函數(shù)進行深拷貝用途的地方,歡迎...
????????-?會拋棄對象的constructor极舔,所有的構(gòu)造函數(shù)都會指向Object凤覆。
????????-?對象有循環(huán)引用,會報錯拆魏。