這兩天遇到了一個問題,如何複製數組,因此就從各個地方找了不少的解決辦法。算是整理一下,這樣以便於本身之後的學習:javascript
首先第一個複製數組咱們都想到的是定義一個數組直接相等就能夠了:java
var arr1 = [1,2,3];
var arr2 = arr1;
arr1[0] = 2;
console.log(arr1[0]); //2
複製代碼
出現這個的緣由就是由於,數組是用堆去保存的,棧中保存的是真正存儲數據的內存地址,相等的時候只是拷貝了存放內存地址的棧,兩個棧仍是同時指向了同一個內存地址,因此在改變其中一個的值,其餘的也跟着改變了,這就是所謂的淺拷貝。數組
因此如何深拷貝一個數組呢?markdown
這個是最原始的辦法,就是把每一個值取出來到另外一個數組中。學習
var arr1 = [1,2,3];
var arr2 = [];
arr1.forEach(function(value,index){
arr2[index] = value;
})
console.log(arr2);
//這個時候改變arr1[0] = 3;那麼輸出arr2[0]仍是等於1
複製代碼
數組的slice方法是截取數組的意思,在以前的數組總結中也有提過。 slice(0)指的是從0開始到末尾截取數組,而後返回一個新的數組,這樣就不會影響到原來的數組了。ui
var arr1 = [1,2,3];
var arr2 = arr1.slice(0);
console.log(arr2); //[1,2,3]
//這個時候改變arr1[2] = 5,那麼輸出arr2[2]仍是等於3
複製代碼
順着這種方法是否是獲得了思惟的開闊,來看看還有哪些是返回新數組的?spa
使用map方法遍歷數組而後返回新的數組,裏面的值不變prototype
var arr1 = [2,3,4];
var arr2 = arr1.map(function(value){
return value;
})
console.log(arr2); //[2,3,4]
複製代碼
鏈接數組,若是鏈接的是一個空,那麼也是返回了新的自己的數組code
var arr1 = [3,4,5];
var arr2 = arr1.concat();
console.log(arr2); //[3,4,5]
複製代碼
ES6擴展運算符實現數組的深拷貝,目前是最簡單的。orm
var arr = [1,2,3,4,5];
var [ ... arr2 ] = arr;
console.log(arr); //[1,2,3,4,5]
console.log(arr2); //[1,2,3,4,5]
複製代碼
這種辦法,不只複製的值,還會把屬性也進行拷貝。
var arr = [1,2,3,4,5];
arr.prototype = 5;
var arr2 = [];
for(var a in arr){
arr2[a] = arr[a];
}
console.log(arr2); // [1,2,3,4,5]
console.log(arr2.prototype); // 5
//以前的方法中新數組的prototype都是undefined
複製代碼
多維數組轉化爲字符串會成爲一維數組。
var arr = [[1,2],3,4,[5,6]];
var arr1 = arr.toString().split(",")
var arr2 = arr.join().split(",")
console.log(arr1) //[1,2,3,4,5,6]
console.log(arr2) //[1,2,3,4,5,6]
複製代碼
可是怎麼能夠保持那種二維數組的狀態呢?須要下面的代碼
var arr = [[1,2],3,4,[5,6]];
var arr3 = JSON.parse(JSON.stringify(arr));
console.log(arr3) // [[1,2],3,4,[5,6]]
複製代碼
若是你有新的方法歡迎留言?若是我找到新的方法會不按期更新...
©burning_韻七七