【js】JS数组复制或克隆新数组修改不影响原数组
前言
有个需求,在修改记录前需要记录下原来的数组内容,为了后续恢复。
准备
网上的很多方法都试过不行,例如。
et arr = [1,2,3,];
let arr1 = arr.clone();
let arr1 = arr.concat();
let arr1 = arr.slice();
又或者遍历直接插进去:
arr .forEach(item => {
arr1 .push(item);
})
至于说为什么:
数组存储对象都是存地址的,所以浅复制会导致 a 和 b 指向同一块内存地址;
例如:
var a=[1,2]
var b=a
则b存储的地址指向了数组[1,2],
如果直接对数组操作,push,pop等,则a,b都会发生变化,因为a和b都指向了堆中的这个数组。
但是假如这样操作,b=[3,4];这个时候发现a没有变化还是[1,2];这是为什么,其实这个不同于刚才的操作,
因为b=[3,4], []是JavaScript的语法糖,new Array();相当于给b重新开辟了堆空间,所以b的地址指向了新的堆地址,而a还是指向之前的地址,所以a和b变得没有关系了。
实施
终于看到一个可以用的!
JSON.stringify( arr );
JSON.parse( arr );
先把数组转成Json再转回去,先转再转就可以完美避开同时修改的问题了!
let arr1 = JSON.parse(JSON.stringify(arr));
参考:
https://blog.csdn.net/qq_40310480/article/details/102941672?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.no_search_link
https://blog.csdn.net/seaalan/article/details/90081473
https://www.cnblogs.com/gaojian0927/p/9765319.html