在一個項目中,咱們一般會經過例如substring,slice,concat等一些方法來操做字符,數組,對象來獲取咱們想要的結果正則表達式
首先我以爲,全部的操做應該對深淺拷貝有一個認識,由於有時候咱們須要利用淺拷貝的特性來達到一些功能效果,更多的時候咱們須要深拷貝來複制對象和數組,在不影響原有數據的基礎上來對數據進行一些操做。
數組
對於引用數據類型,名存在棧內存中,值存在於堆內存中,可是棧內存會提供一個引用的地址指向堆內存中的值bash
一、JSON.parse(JSON.stringify(obj))複製代碼
淺拷貝的一些方法:
對一級屬性沒有影響的,但對二級以及更深層次的拷貝會有影響: 函數
一、arr.concat() // 合併多個數組
二、[...arr1, ...arr2] // ES6新增延展操做符,合併多個數組
三、arr.slice() // 截取數組中的一部分,不破壞原數組,返回新數組
四、Object.assign(target, ...sources) 複製代碼
一、string.substring([startIndex], endIndex) // 截取字符
二、string.slice([startIndex], endIndex) // 截取字符
二、string.charAt(index) // 返回指定位置的字符複製代碼
一、arr.push() // 添加至數組的末尾,並返回修改後的數組的長度
二、arr.unshift() // 在數組的開始添加任意個新元素,並返回修改後的數組長度
三、arr.splice() // 刪除指定位置指定個數的元素,並返回
複製代碼
一、arr.join() // 數組轉爲以特定符號分割的字符,默認以逗號分割
二、string.split(separator, howmany) // 把一個字符串分割乘字符串數組
三、arr.toString() //把數組轉換爲字符串,並返回結果,每一項以逗號分割複製代碼
var arr = [
{ name: "test" },
{ title: "flag" },
"string",
2
]
var deepClone = (obj) => {
return JSON.parse(JSON.stringify(obj))
}
var deepCopyArr = deepClone(arr)
deepCopyArr[0].name = 'test1'
console.log('deepCopyArr', deepCopyArr)
console.log('arr', arr)
// deepCopyArr [{ name: 'test1' }, { title: 'flag' }, 'string', 2]
// arr [{ name: 'test' }, { title: 'flag' }, 'string', 2]複製代碼
侷限性:一、不能解決循環引用的對象; 二、 會忽略undefined;三、會忽略symbol;四、不能序列化函數ui
Tip: 參數能夠是具體的值,也能夠是數組對象spa
// 淺拷貝
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 = [
{ name: "test" },
{ title: "flag" },
"string",
2
]
concatArr = arr.concat()
concatArr[0].name = "test2"
concatArr[3] = 10
console.log('concatArr', concatArr)
console.log('arr', arr)
// concatArr2 [ { name: 'test2' }, { title: 'flag' }, 'string', 10 ]
// arr [ { name: 'test2' }, { title: 'flag' }, '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 = [
{ name: "test" },
{ title: "flag" },
"string",
2
]
var arr2 = [3, 4, 5]
var arr3 = [...arr, ...arr2]
arr3[0].name = "test2"
arr3[2] = 6
// arr [{ name: 'test2' }, { title: 'flag' }, 'string', 2]
// arr2 [3, 4, 5]
// arr3 [{ name: 'test2' }, { title: 'flag' }, 6, 2, 3, 4, 5]複製代碼
// 淺拷貝
var arr = [
{ name: "test" },
{ title: "flag" },
"string",
2
]
var arr1 = arr.slice() // [{ name: 'test' }, { title: 'flag' }, 'string', 2]複製代碼
// 複製對象若更改,對於原數據的一級屬性沒有影響,對二級以上的屬性有影響
arr1[0].name = 'test2'
// arr [{ name: 'test2' }, { title: 'flag' }, 'string', 2]
// arr1 [{ name: 'test2' }, { title: 'flag' }, '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 = {
a: 1,
b: 2,
c: 3,
d: {
child: 4
}
}
var object2 = Object.assign({}, object)
// object2 {a: 1, b: 2, c: 3, d: { child: 4 }}複製代碼
// 複製對象若更改,對於原數據的一級屬性沒有影響,對二級以上的屬性有影響
object2.a = 'test'
object2.d.child = 'test2'
// object2 {a: 'test', b: 2, c: 3, d: { child: 'test2' }}
// object {a: 1, b: 2, c: 3, d: { child: 'test2' }}複製代碼
// 合併對象
var o1 = {a: 1, b: 2, c: 1}
var o2 = {b: 3, c: 4}
var obj = Object.assign({}, o1, o2) // { a: 1, b: 3, c: 4 }複製代碼
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']複製代碼