這篇“js中怎么復制一個數組”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“js中怎么復制一個數組”文章吧。
在js中,我們經常會用到數組復制,Array是引用類型,如果用arrA=arrB簡單的把一個數組賦值,并沒有創造出一個新數組,arrA和arrB其實指向的還是同一個地址,改變一個另一個也會隨之改變,很明顯這并不是我們想要的
var arr = [1, 2, 3]; var newArr = arr; arr.push(4); console.log(newArr1); // [1, 2, 3, 4]
(適用于數組并不復雜,即數組中沒有嵌套對象或者嵌套數組)
concat()方法用于連接兩個或多個數組;
concat() 方法不會更改現有數組,而是返回一個新數組,其中包含已連接數組的值。
var arr = [1, 2, 3]; var newArr = arr.concat(); arr.push(4); console.log(newArr); // [1, 2, 3]
slice() 方法以新的數組對象,返回數組中被選中的元素;
slice() 方法選擇從給定的 start 參數開始的元素,并在給定的 end 參數處結束,但不包括;
slice() 方法不會改變原始數組;
var arr = [1, 2, 3]; var newArr = arr.slice(); arr[0] = 10; console.log(arr);// [10, 2, 3] console.log(newArr);// [1, 2, 3]
var arr = [1, 2, 3]; var [ ...newArr ] = arr; arr[0] = 10; console.log(arr); // [10, 2, 3] console.log(newArr);// [1, 2, 3]
var arr = [1, 2, 3]; var newArr = Object.assign([], arr); arr[0] = 10; console.log(arr);// [10, 2, 3] console.log(newArr);// [1, 2, 3]
如果數組元素是對象或者數組,上面四種方法就會只拷貝數組或者對象的引用,如果我們對其中一個數組進行修改,另一個數組也會發生變化
比如:
var arr = [ { a: 1 }, [ 1, 2 ], 3 ];
let newArr = arr.concat();
arr[0].a = 2;
console.log(arr); // [ { a: 2 }, [ 1, 2 ], 3 ]
console.log(newArr);// [ { a: 2 }, [ 1, 2 ], 3 ] 值被影響(可以完全拷貝一個數組,即使嵌套了對象或者數組,兩者也不會互相影響)
var arr = [ { a: 1 }, [ 1, 2 ], 3 ];
// let newArr = JSON.parse(JSON.stringify(arr));
let newArr = arr.concat();
arr[0].a = 2;
console.log(arr); // [ { a: 2 }, [ 1, 2 ], 3 ]
console.log(newArr);// [ { a: 1 }, [ 1, 2 ], 3 ]但是該方法是有局限性的
會忽略 undefined
會忽略 symbol
不能序列化函數
不能解決循環引用的對象
比如下面這個例子:
let a = {
age: undefined,
sex: Symbol('male'),
jobs: function() {},
name: 'sun'
}
let b = JSON.parse(JSON.stringify(a))
console.log(b) // {name: "sun"}拷貝的時候判斷屬性值的類型,如果是對象,繼續遞歸調用深拷貝函數(簡易版)
var deepCopy = function(obj) {
// 判斷是否是對象
if (typeof obj !== 'object') return;
// 判斷obj類型,根據類型新建一個對象或者數組
var newObj = obj instanceof Array ? [] : {}
// 遍歷對象,進行賦值
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
let val = obj[key];
// 判斷屬性值的類型,如果是對象,遞歸調用deepCopy
newObj[key] = typeof val === 'object' ? deepCopy(val) : val
}
}
return newObj
}_.cloneDeep(value)
其中value就是要深拷貝的值
簡單例子
var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => falsenpm i --save lodash
import _ from 'lodash'; Vue.prototype._ = _;
let newObj = this._.cloneDeep(oldObj)
以上就是關于“js中怎么復制一個數組”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。