之前在寫掃雷的時候,因為需要用到二維數組,當時就在復制數組這里出現了問題,所以記錄一下。
當我們在需要復制數組的時候一定需要注意,數組是復合的數據類型,直接復制的話,只是復制了指向底層數據結構的指針,而不是克隆一個全新的數組。我們來看例子:
var arr1 = [1, 2, 3]
var arr2 = arr1
arr1[0] = 5
console.log(arr2) // [5, 2, 3]
上面代碼中,arr2
並不是 arr1
的克隆,而是指向同一份數據的另一個指針。修改 arr2
,會直接導致 arr1
的變化。
那么如果正確的復制數組呢?可以使用 concat() 用於連接兩個或多個數組。該方法不會改變現有的數組,而僅僅會返回被連接數組的一個副本。看例子:
var arr1 = [1, 2, 3]
var arr2 = arr1.concat()
arr1[0] = 5
console.log(arr2) // [1, 2, 3]
因為 concat()
返回的是一個副本,所以這個時候改變 arr1
就不會導致 arr2
改變了。
還可以利用 ES6 中的擴展運算符來復制數組
var arr1 = [1, 2];
// 寫法一
var arr2 = [...arr1];
// 寫法二
var [...arr2] = arr1;
參考資料:阮一峰ES6入門:擴展運算符的應用