js 兩個相等的數組,修改其中一個怎麼作到不改變另一個

現有 :數組

let arrA = [1, 2, 3];
let arrB = arrA;
console.log(arrA);//[1, 2, 3]
console.log(arrB);//[1, 2, 3]
1, 2, 3];
let arrB = arrA;
console.log(arrA);//[1, 2, 3]
console.log(arrB);//[1, 2, 3]
1. 若是改變arrA,則arrB也會改變:.net

arrA[0] = 10; 
console.log(arrA);//[10, 2, 3]
console.log(arrB);//[10, 2, 3]
//[10, 2, 3]
console.log(arrB);//[10, 2, 3]
2. 若是改變arrB,則arrA也會改變:對象

 

arrB.push(4);
console.log(arrA);//[1, 2, 3, 4] 
console.log(arrB);//[1, 2, 3, 4] 
//[1, 2, 3, 4] 
console.log(arrB);//[1, 2, 3, 4] 
緣由:js中array是引用類型,也就是arrA和arrB的原數據存儲地址是同樣的,arrA和arrB都是對原數據的引用,因此修改其中一個,另外一個也會改變。這就好像是如今有一個房間,兩扇門,AB兩人分別從不一樣的門進去所看到的的房間是同樣的,此時A拿走一個蘋果,B會看到房間裏少了一個蘋果;B從外面帶了一瓶飲料回到房間,A也會看到這個房間多了一瓶飲料。blog

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~string

那麼兩個相等的數組,修改其中一個怎麼作到不改變另一個呢?也就是說僅僅是arrA賦值給arrB,而不是把引用賦給它。console

我所知道的解決方案有如下4種:引用

方法一:concat()用於鏈接兩個或多個數組。該方法不會改變現有的數組,而僅僅會返回被鏈接數組的一個副本。
let arrA = [1, 2, 3];
let arrB = [].concat(arrA);
console.log(arrA,arrB);  //[1, 2, 3],[1, 2, 3]
//若是改變arrA,  arrB不會改變
arrA.splice(0,1);
console.log(arrA,arrB);  //[2, 3],[1, 2, 3]
//若是改變arrB, arrA不會改變
arrB[0] = 0;
console.log(arrA,arrB);   //[1, 2, 3],[0, 2, 3]
方法二:先JSON.stringify( ) 後 JSON.parse( )
let arrA = [1, 2, 3];
let arrB = JSON.parse(JSON.stringify(arrA));  //arrB: [1, 2, 3]
//若是 arrB.pop();            //arrB:[1,2],   arrA:[1,2,3]
//若是 arrA.shift();          //arrA:[2,3],   arrB:[1,2,3]
方法三:jQuery的extend方法
let a = [1,2,3];
let b = $.extend(true,[],a)
b[0]++   //b:[2,2,3]    a:[1,2,3]
方法四:Object.assign()方法 或者 [...arr]
let a = [1,2,3];
let b = Object.assign([],a)   //或者 let b = [...a]  
b[0]++   //b:[2,2,3]    a:[1,2,3]
可是須要注意的是,若是是對象數組,即便是用方法一的concat、方法四的Object.assign()或者[...arr]賦值也是會互相影響的:
let a=[{name:'zhangsan',age:20}]
let b = Object.assign([],a)   //或者 let b = [...a]  或者 let b = [].concat(a) 
b[0].age=25;   //b:[{name:'zhangsan',age:25}]    a:[{name:'zhangsan',age:25}]
此時用方法二的先JSON.stringify( ) 後 JSON.parse( )
--------------------- 
做者:音浪豆豆_Rachel 
來源:CSDN 
轉載自原文:https://blog.csdn.net/u014054437/article/details/80415174 方法

相關文章
相關標籤/搜索