前端 js 深淺拷貝

2021-09-11 16:29:13 字數 1660 閱讀 6539

我們了解到物件(引用)型別在賦值的過程中其實是複製了位址,從而會導致改變了一方其他也都被改變的情況。通常在開發中我們不希望出現這樣的問題。

let a = 

let b = a

a.age = 2

console.log(b.age) // 2 希望是1

let a = 

}let b = a

a.obj.aa = 5

console.log(b.obj.aa) // 5 希望是3

1)淺拷貝

如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。

function shallowcopy(obj) ;

// 只複製可遍歷的屬性

for (key in obj)

}return copy;

}

let a = 

let b = shallowcopy(a)

a.age = 2

console.log(b.age) // 1

js內部實現了淺拷貝,如object.assign(target, source),其中第乙個引數是我們最終複製的目標物件,後面的所有引數是我們的即將複製的源物件,支援物件或陣列,一般呼叫的方式為

var newobj = object.assign({}, originobj);
2)深拷貝

其實深拷貝可以拆分成 2 步,淺拷貝 + 遞迴,淺拷貝時判斷屬性值是否是物件,如果是物件就進行遞迴操作,兩個一結合就實現了深拷貝。

1、簡單實現

function clonedeep(source) ;

for(var key in source) 應該返回 null

// 問題二 陣列會轉成物件 [1,2] 會變成

target[key] = clonedeep(source[key]); // 注意這裡

} else }}

return target;

}

let a = 

}let b = clonedeep(a)

a.obj.aa = 5

console.log(b.obj.aa) // 3

乙個簡單的深拷貝就完成了,但是這個實現還存在很多問題。

2、:解決以上兩個問題

function clonedeep2(source) ;

for(var key in source) else }}

return target;

}// 解決typeof null === 'object'

function isobject(obj)

3、

function deepclone(source) 

//解決陣列相容

var target = array.isarray(source) ? : {};

for(let key in source)

return target;

}

JS深 淺拷貝

在js中,資料型別分為基本資料型別和引用資料型別兩種。對於基本資料型別來說,它的值直接儲存在棧記憶體中,而對於引用型別來說,它在棧記憶體中只是儲存了乙個指向對記憶體的引用,而真正的資料儲存在堆記憶體中。object array 這兩個就是引用型別,當我門直接去拷貝的話 copyobj obj 拷貝的...

js 深淺拷貝

深拷貝就是複製內部內容 淺拷貝就是複製記憶體位址 var obj 淺拷貝 引用傳遞 淺拷貝就是賦值,將鑰匙複製乙份 var o obj 深拷貝 內部內容複製乙份 將房子複製乙份 方法一 var str json stringify obj var obj3 json parse str 方法二 va...

js深淺拷貝

1.什麼是深淺拷貝 簡單的來說,加入b複製a a改變 如果b也跟著改變的話,那就是淺拷貝,反之是深拷貝 實現淺拷貝方法 1.賦值操作 var a 0 1,2 3,4 var b a a 0 5console log a 5,1,2,3,4 console log b 5,1,2,3,4 2.es6 ...