操作字元 物件方法, 深淺拷貝

2021-09-24 07:02:19 字數 4891 閱讀 2375

在乙個專案中,我們通常會通過例如substring,slice,concat等一些方法來操作字元,陣列,物件來獲取我們想要的結果

首先我覺得,所有的操作應該對深淺拷貝有乙個認識,因為有時候我們需要利用淺拷貝的特性來達到一些功能效果,更多的時候我們需要深拷貝來複製物件和陣列,在不影響原有資料的基礎上來對資料進行一些操作。

如果是基本元素,就會拷貝乙份,互不影響

如果是物件或者陣列,就只會拷貝物件和陣列的引用,無論是對新還是舊陣列或物件操作,兩者都會發生變化

完全拷貝了乙個物件,即使巢狀了物件,兩者也相互分離,修改乙個物件的屬性,也不會影響另乙個

對於引用資料型別,名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供乙個引用的位址指向堆記憶體中的值

深拷貝的方法:

1、json.parse(json.stringify(obj))複製**

淺拷貝的一些方法:

對一級屬性沒有影響的,但對二級以及更深層次的拷貝會有影響:         

1、arr.concat() // 合併多個陣列    

2、[...arr1, ...arr2] // es6新增延展操作符,合併多個陣列

3、arr.slice() // 擷取陣列中的一部分,不破壞原陣列,返回新陣列

4、object.assign(target, ...sources) 複製**

1、string.substring([startindex], endindex)  // 擷取字元

2、string.slice([startindex], endindex) // 擷取字元

2、string.charat(index) // 返回指定位置的字元複製**

1、arr.push()  // 新增至陣列的末尾,並返回修改後的陣列的長度

2、arr.unshift() // 在陣列的開始新增任意個新元素,並返回修改後的陣列長度

3、arr.splice() // 刪除指定位置指定個數的元素,並返回

複製**

1、arr.join()   // 陣列轉為以特定符號分割的字元,預設以逗號分割

2、string.split(separator, howmany) // 把乙個字串分割乘字串陣列

3、arr.tostring() //把陣列轉換為字串,並返回結果,每一項以逗號分割複製**

var arr = [    

,

,

"string",

2]var deepclone = (obj) =>

var deepcopyarr = deepclone(arr)

deepcopyarr[0].name = 'test1'

console.log('deepcopyarr', deepcopyarr)

console.log('arr', arr)

// deepcopyarr [, , 'string', 2]

// arr [, , 'string', 2]複製**

侷限性:1、不能解決迴圈引用的物件; 2、 會忽略undefined;3、會忽略symbol;4、不能序列化函式

tip:  引數可以是具體的值,也可以是陣列物件

// 淺拷貝

var arr = [1, 2, 3]

var concatarrconcatarr = arr.concat()

console.log('concatarr', concatarr) // [1, 2, 3]

console.log('arr', arr) // [1, 2, 3]複製**

// 複製物件若更改,對於原資料的一級屬性沒有影響,對二級以上的屬性有影響

var arr = [

,

,

"string",

2]concatarr = arr.concat()

concatarr[0].name = "test2"

concatarr[3] = 10

console.log('concatarr', concatarr)

console.log('arr', arr)

// concatarr2 [ , , 'string', 10 ]

// arr [ , , 'string', 2 ]

複製**

// 連線兩個或多個陣列

var arr = [1, 2, 3]

var concatarr = arr.concat('test') // 連線具體的值

console.log('concatarr', concatarr) // [1, 2, 3, 'test']

var concatarr2 = arr2.concat([4, 5, 6]) // 連線陣列

console.log('concatarr2', concatarr2) // [1, 2, 3, 4, 5, 6]

console.log('arr2', arr2) // [1, 2, 3] // 原陣列未被破壞

複製**

var arr = [    

,

,

"string",

2]var arr2 = [3, 4, 5]

var arr3 = [...arr, ...arr2]

arr3[0].name = "test2"

arr3[2] = 6

// arr [, , 'string', 2]

// arr2 [3, 4, 5]

// arr3 [, , 6, 2, 3, 4, 5]複製**

// 淺拷貝

var arr = [

,

,

"string",

2]var arr1 = arr.slice() // [, , 'string', 2]複製**

// 複製物件若更改,對於原資料的一級屬性沒有影響,對二級以上的屬性有影響

arr1[0].name = 'test2'

// arr [, , 'string', 2]

// arr1 [, , 'string', 2]

複製**

// 擷取, 不破壞原陣列,返回新陣列

var arr1 = [3, 4, 5]

var arr2 = arr2.slice(0, 1) // [3]

var arr3 = arr2.slice(0, -1) // [3, 4]

var arr4 = arr2.slice(1) // [4, 5]複製**

// 複製乙個物件

var object =

}var object2 = object.assign({}, object)

// object2 }複製**

// 複製物件若更改,對於原資料的一級屬性沒有影響,對二級以上的屬性有影響

object2.a = 'test'

object2.d.child = 'test2'

// object2 }

// object }複製**

// 合併物件

var o1 =

var o2 =

var obj = object.assign({}, o1, o2) // 複製**

string = 'test'

var string2 = string.substring(1, 3) // 'es'

var string3 = string.slice(1, 3) // 'es'

var string4 = string.charat(1) // 'e'

複製**

var arr = [3, 4, 5]

arr.push(6) // [3, 4, 5, 6]

arr.unshift(2) // [2, 3, 4, 5, 6]

arr.splice(1, 1) // [2, 4, 5, 6]

arr.splice(1, 0, 'test') // [2, 'test', 4, 5, 6]複製**

var arr = [3, 4, 5]

var arr1 = arr.join() // 3, 4, 5

var arr2 = arr.join('/') // 3/4/5複製**

var arr3 = arr.tostring()  // 3, 4, 5複製**

var str = "how are you doing today"

var arr1 = str.split(" ") // ['how', 'are', 'you', 'doing', 'today']

var arr2 = str.split(" ", 3) // ['how', 'are', 'you']複製**

深淺拷貝以及深淺拷貝的方法

先考慮一種情況,對乙個已知物件進行拷貝,編譯系統會自動呼叫一種建構函式 拷貝建構函式,如果使用者未定義拷貝建構函式,則會呼叫預設拷貝建構函式。執行結果 呼叫一次建構函式,呼叫兩次析構函式,兩個物件的指標成員所指記憶體相同,name指標被分配一次記憶體,但是程式結束時該記憶體卻被釋放了兩次,會造成記憶...

深淺拷貝方法

let a let b a a.age 2 console.log b.age 2首先可以通過object.assign來解決這個問題,很多人認為這個函式是用來深拷貝的。其實並不是,object.assign只會拷貝所有的屬性值到新的物件中,如果屬性值是物件的話,拷貝的是位址,所以並不是深拷貝。le...

物件的深淺拷貝

import dsjcopyctrl.h inte ce dsjcopyctrl end implementation dsjcopyctrl void viewdidload void strcopy void arrcopy void diccopy 0x2810955e0 nssingleen...