js中的深拷貝與淺拷貝

2021-10-18 14:35:56 字數 2291 閱讀 7192

var obj =

1.遞迴的方法實現深拷貝

function

deepcopy

(source)

;for

(var k in source)

else}}

return target;

}function

isobject

(obj)

var obj1 =

deepcopy

(obj)

;obj1.name=

'meituan'

;obj1.age =7;

obj1.others[2]

=3;console.

log(

json

.stringify

(obj1));

console.

log(

json

.stringify

(obj))//

//

2.通過json物件實現深拷貝

function

deepclone2

(obj)

注意:無法實現物件中方法的深拷貝,處理不了函式

3.通過object.assign()拷貝(當物件只有一級屬性為深拷貝;當物件中有多級屬性時,二級屬性後就是淺拷貝)

var obj =

var obj1 = object.

assign

(,obj)

;obj1.name=

'meituan'

;obj1.age =7;

console.

log(obj.name,obj.age)

;

object.assign 也算是淺拷貝,也就是如果源物件裡的某些key對應的值是object型別,則只會拷貝對此object型別資料的引用,也就是說會多處共用乙個儲存空間,乙個地方改變了,其他地方在取值也就變了

var obj =

var obj1 = object.

assign

(,obj)

;obj1.name=

'meituan'

;obj1.age =7;

obj1.others[2]

=3;console.

log(

json

.stringify

(obj1));

//console.

log(

json

.stringify

(obj));

//

1. concat(arr1, arr2,…) 僅適用於對不包含引用物件的一維陣列的深拷貝

注意:當陣列中的元素均為一維是深拷貝 陣列中元素一維以上是值的引用

2.slice(idx1, idx2) 僅適用於對不包含引用物件的一維陣列的深拷貝

1. 沒有引數是拷貝陣列

2. 只有乙個引數是從該位置起到結束拷貝陣列元素

3. 兩個引數,拷貝從起始位置到結束位置的元素(不包含結束位置的元素:含頭不含尾)

注意:當陣列中的元素均為一維是深拷貝,陣列中元素一維以上是值的引用

3.es6方法 僅適用於對不包含引用物件的一維陣列的深拷貝

var a=[1

,2,3

]var b=

[...a]

; b.

push(4

);console.

log(b)

;//1,2,3,4

console.

log(a)

//1,2,3

var str=

"20200901"

var pattern =

/(\d)(\d)(\d)/

;str = str.

replace

(pattern,

'$1-$2-$3');

str =str.

replace

(new

regexp

(/-/gm),

"/")

;//將所有的'-'轉為'/'即可

js中的深拷貝與淺拷貝

今天面試被問到js中深淺拷貝的問題,當時回答的並不好,回來搜尋了一波,現做下總結 js中針對引用型別的拷貝分為兩種 深拷貝和淺拷貝 淺拷貝比較簡單,分為兩類,一類是直接對源物件進行拷貝,實際上就是引用型別的賦值,拷貝的僅僅是物件引用,如 var obj var newobj obj newobj.a...

JS中的深拷貝與淺拷貝

說到深淺拷貝的時候就不得不說一下js中的變數型別了 淺拷貝分兩種情況,拷貝源物件的引用和源物件拷貝例項,但其屬性拷貝引用.拷貝源的引用 eg let obj1 let obj2 obj1 console.log obj1 obj2 true obj1.a 2 console.log obj2.a 2...

JS中的深拷貝與淺拷貝

深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體,而不是引用,深拷貝的實現 1.通過遞迴解決 var a function deepcopy initobj,finalobj for var i in initobj if typeof initobj i object argume...