這篇文章帶給大家的內容是關於JavaScript中陣列克隆的方法介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
js主要分基本資料型別及引用資料型別兩大類別
基本資料型別包括:number,string,undefine,null, boolean,Symbol(es6新增)
引用資料型別:Object,Array,Function,Data等
注意:基本資料型別放在**堆疊空間內**,並且是依值存放,可以直接讀取和操作。
引用資料型別存放在**堆空間內**(門),變數的值其實是指向堆空間的位址(鑰匙),因此如果複製這個變量,相當於複製鑰匙。
let arr = [1,2,3,4,5] let arr1 = arr // 这一步相当于把arr栈空间的地址赋给了arr1,其实arr和arr1操作的是同一个堆空间的对象 arr1.push(6) // arr1 = [1,2,3,4,5,6] console.log(arr) //[1,2,3,4,5,6]
因此對於引用型別的拷貝,需要拷貝堆空間的物件
陣列淺拷貝
1.運用陣列slice與concat方法傳回一個新陣列的特性
let arr = [1,2,3,4,5] let arr1 = arr.slice() //[1,2,3,4,5] let arr2 = arr.concat() //[1,2,3,4,5]
2.簡單粗暴的方法-遍歷
let arr = [1,2,3,4,5] let arr2 = [] arr.forEach(item=>{ arr2.push(item) } ) console.log(arr2)
3.es6新增方法-拓展運算子
let arr = [1,2,3,4,5] let arr1 = [...arr] //[1,2,3,4,5]
4.es6新增方法-Object.assign
let arr = [1,2,3,4,5]
let arr1 = []
Object.assign(arr1,arr)
console.log(arr1) //[1,2,3.4,5]
如果數組裡嵌套數組和對象,淺拷貝只會拷貝該數組或對象存放在棧空間的地地址,因此無論在新舊數組中改變此地址指向的對象,兩個數組都會發生改變。因此我們需要深拷貝來拷貝此類數組。
數組深拷貝
1.普通遍歷,遍歷到引用類型時候進行引用類型的拷貝
let arr = [1,2,3,4,5,{name:'bob'},['a','b']] function clone (arr) { let arr1 = [] arr.forEach(item=>{ //如果不是object,将该值插入到新数组 if(typeof(item) !== 'object') { arr1.push(item) } else { //根据遍历的对象新建一个相同类型的空对象 let obj = item instanceof Array ? [] : {} for(var key in item){ if(item.hasOwnProperty(key)){ obj[key] = item[key] } } arr1.push(obj) } }) return arr1 } let arr1 = clone(arr) arr1[5].name = 'js' console.log(arr,'arr',arr1,'arr1')
2.簡單粗暴(能拷貝數組和對象,但不能拷貝函數)
let arr = [1,2,3,4,5,{name:'bob'},['a','b']] let arr1 = JSON.parse(JSON.stringify(arr))
這篇文章到這裡就已經全部結束了,更多其他精彩內容可以關注PHP中文網的JavaScript教程視頻欄目!
#以上是JavaScript中數組克隆的方法介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!