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也會改變:

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也會看到這個房間多了一瓶飲料。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

我所知道的解決方案有以下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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM