這里只研究對象,不專門研究別數(shù)據(jù)類型
淺拷貝:
兩個變量之間賦值顽素,它們存著相同的地址,共同指向同一對象徒蟆⌒渤觯或者兩者的對象成員也存著相同地址指向同一對象,就是淺拷貝段审。
第一個例子:
把a賦值給b全蝶,是把變量a的地址拷貝給了b,他倆都在棧中存了相同的地址寺枉,這兩個地址指向同一個對象抑淫。通過變量b改變對象的屬性,再用變量a再次調用該屬性姥闪,得到的結果是改變后的始苇。
第二個例子:
此時a和b分別存了兩個地址,也就是說指向了兩個對象筐喳,二者不是同一個催式。
但是他倆的z屬性是咋回事?我來告訴你避归,a.z存的是一個地址蓄氧,賦值給b.z的也是同一個地址。二者指向同一個對象槐脏。和第一個例子一樣喉童。
深拷貝:
深是淺的反義詞,綜上例顿天,變量a與b堂氯,讓他倆指向不同的對象就行了,且多層嵌套的子對象也要分別存在兩個地址牌废。
這里示范兩個可以做到深拷貝的方法:
第一個(看不懂API的去查文檔):
JSON.parse(JSON.stringify(obj))
PS:存在大bug咽白,JSON.stringify()會忽略函數(shù)和undefined,會把Date實例轉為字符串鸟缕。也就是說你不可能用這個方法實現(xiàn)完美拷貝晶框,如果對象里面有上述幾個數(shù)據(jù)類型,那就完了懂从。
第二個(自己封裝一個方法):
這個方法不能拷貝函數(shù)授段,Date實例,正則實例番甩,不信你試試侵贵。
PS:如果一個對象的一個屬性指向了自身,我們叫它環(huán)缘薛,用上面兩種方法拷貝它窍育,全報錯卡睦。見下例: