陣列和物件的淺拷貝和深拷貝

2022-08-11 08:27:12 字數 1915 閱讀 4545

前言: 對於拷貝需要考慮資料的型別

資料型別分為:基本資料型別和引用型別;

基本資料型別是儲存在棧中的簡單資料;常見:string,number,undefined,null,boolean以及es6新定義的symbol;

引用型別值是引用型別例項,它是儲存在堆中的乙個物件,引用型別是一中資料結構;常見:array,object,function,date,regexp等,es6提供的set和map新的資料結構;

複製時的區別:

基本資料型別是按值訪問的;

引用型別複製時,是複製的存在棧中的指標,指標指向堆內的資料,如果只是簡單的賦值,就只是賦值了棧中的指標,通過乙個變數操作堆內的物件會影響兩者;

一、淺拷貝

理解:建立乙個新物件,這個物件有這原始物件屬性值的乙份精確拷貝;如果是基本型別,則拷貝的是基本型別的值,如果是引用型別,則拷貝的是記憶體位址,所以乙個物件改變了這個位址對應點堆內資料,則會影響到另外乙個物件

1:object.assign(target,...source)

# es6提供的淺拷貝的方法,接受的第乙個引數是拷貝的目標,第二個引數將要拷貝的源物件

# object.assign()只是拷貝根屬性上的值(物件的第一層屬性),如果根屬性上的值是引用型別的資料,則仍是淺拷貝

# 特點: 不會拷貝繼承的屬性;可以拷貝symbol型別的值;

# 可以理解為:object.assign()只是簡單的=賦值,遍歷從右到左遍歷source上的屬性賦值到target目標物件上

2:擴充套件運算子 - 淺拷貝

var cloneobj = // 物件

var clonearr = [ ...arr ]  // 陣列

# 對於值是物件的屬性無法完全拷貝成兩個完全不相同的物件;但是如果物件的值都是基本資料型別的話,擴充套件運算子還是比較方便的

3:array.property.slice() - arr.slice(begin, end)

返回乙個新的陣列物件,這一物件是由begin和end決定的原陣列的淺拷貝;原陣列不改變;

4:concat():該方法是連線兩個或多個陣列,但它不會修改原先的陣列;問題:只會對第一層進行拷貝,對深層的不起作用

二、深拷貝

理解:將乙個物件在記憶體中完整的拷貝出來,並記憶體中開闢乙個新的空間存放新物件,這兩個物件是相互獨立的,且修改新物件不會影響原先的物件

1:json.stringify()   json.parse()

原理:將物件序列化成json字串,將物件的內容轉化成字串的形式再儲存到磁碟上,再用json.parse()反序列化將json字串轉換成新的物件

注意:拷貝的物件的值有函式、undefined、symbol則經過反序列化後的json字串中的鍵值對會消失;物件中包括nan、infinity則序列化的後變為null

//

json

var obj =]}//

針對物件深拷貝

var newobj ={}

//便利物件裡的鍵進行json編碼和解析

for (var k in

obj)

//該方法對物件裡的值是基本資料型別是可以的,對於引用型別是不成立的

2:遞迴

//

2:遞迴深拷貝

var obj =,

obj:

}function

deepclone(obj)

//拷貝物件不能為空且是物件

if (obj && typeof obj === 'object')

else}}

}return

cloneobj

}

// 該方法只是針對object引用型別的值進行迴圈迭代

3:lodash和jquery都有已經封裝好的深拷貝的方法,有興趣的可以深入研究下

陣列,物件的拷貝方式(深拷貝和淺拷貝)

引言typeof 檢測arr或者物件的時候只會返回 object 引用資料型別 一般來說就是函式 物件 陣列 1.遞迴方式 function isobject obj var deepclone function obj return num 最後返回num console.log deepclon...

JS陣列和物件的淺拷貝和深拷貝

共勉 在許多程式語言中,傳遞引數和賦值是通過值的直接複製或者引用複製完成的。在j ascript中,對於值是直接進行複製還是引用複製在語法上是沒有區別的,完全是根據值的型別來決定的。在j ascript中,簡單值總是通過值的直接複製來進行賦值傳遞的 null,undefined,字串,數字,布林,s...

物件的淺拷貝和深拷貝

淺拷貝 1.用for迴圈獲取引用物件的屬性和值,賦值給新物件 object.prototype.num 1 person1 function clone origin,target for var key in origin return tar var person2 clone person1 ...