認識對象的深拷貝和淺拷貝
在js的使用過程中, 賦值操作是最常見的一環(huán), 而在賦值操作中, 會有一個容易被初學(xué)者忽略的問題就是對象的深淺拷貝.
當賦值的類型是基本數(shù)據(jù)類型時, 是不會遇到上述的問題的, 而當賦值類型為對象時(其中數(shù)組也是對象), 我們賦給的其實只是該對象的引用, 當修改新賦予的對象的值的時候, 舊的對象的值也會被修改. 這種賦值操作被稱為淺拷貝(即只拷貝了對象類型的引用)
var a = 5;
var b = a; //將a的值賦給b
b = 10; //將b的值修改為10, a不會受到影響
var c = {
foo: 5
}
var d = c; //將a的對象賦給b
d.foo = 10; //修改b中foo的值時, a中的foo也會被修改
console.log(c.foo); // -> 10
var e = [ 1, 2, 3];
var f = e; //將數(shù)組e賦值給f
f[0] = 100; //修改f[0]
console.log(e); // -> [100, 2, 3]
很多時候, 我們不想僅僅獲得對象的引用, 而是和原對象完全一樣的新對象, 這時候就需要實現(xiàn)對象的深拷貝
如何實現(xiàn)對象的深拷貝
- JSON.parse(JSON.stringfy(obj))
最簡單的方法就是使用JSON序列化的方法, 將一個對象轉(zhuǎn)化為JSON字符串然后再解析成js語句, 在對象深度只有一層的時候, 該方法簡單有效, 而當對象中嵌套了對象的時候, 內(nèi)層的對象仍為對象的引用. 且JSON序列化會忽略函數(shù)對象.