JS函数calcNewtonPath意外修改入参matA,slice拷贝无效该如何解决?
问题原因
Array.slice()是浅拷贝方法,仅能复制二维数组的外层数组,内层的所有子数组仍然和原入参matA的子数组共享引用。你执行temp[i].push()操作时,实际修改的就是原matA对应的子数组内容,所以入参会被意外修改。- 你调用的
matrix.solve方法会修改传入的数组,同样是因为传递的是引用而非独立副本,会直接修改传入的temp变量。
解决方案
把原来的浅拷贝逻辑替换为二维数组深拷贝即可完全隔离原始入参和临时计算变量:
function calcNewtonPath(matA,matB,m,n){ // 二维数组深拷贝,断开和原matA的所有引用关联 let temp = matA.map(row => row.slice()) for(let i=0;i<m;i++){ temp[i].push(-matB[i]) } // 如果matrix.solve修改temp会影响后续逻辑,再给该方法传一次深拷贝后的副本即可 return matrix.solve(structuredClone(temp), m, n) }
补充说明
- 普通数值类型的二维数组用
map + slice的方式实现深拷贝性能最好,兼容性也最高。 - 如果你的矩阵存在更深层级的结构,或者需要兼容特殊数据类型,可以直接用全局方法
structuredClone(matA)实现全结构深拷贝,不需要自己手写遍历逻辑。 - 兼容性要求低的场景下也可以用
JSON.parse(JSON.stringify(matA))实现深拷贝,适配普通数值矩阵完全够用。
内容的提问来源于stack exchange,提问作者Trung Kiên
相关产品推荐
相关产品推荐

