You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript技术问题:父数组独立时子数组仍引用其他数组?

解决JavaScript中数组赋值后修改副本影响原数组的问题

嘿,自己撸神经网络的业余开发者太酷了!不过你碰到的这个数组问题,绝对是JavaScript里新手(甚至不少老鸟)都会踩的经典坑。

你已经摸到问题的核心了——在JS里,数组属于引用类型,当你把一个数组赋值给另一个变量时,比如写了:

const originalWeights = [[0.1, 0.2], [0.3, 0.4]];
const copiedWeights = originalWeights;

这时候copiedWeights并没有拿到一个全新的数组副本,它只是拿到了指向原数组在内存中位置的引用。说白了,两个变量其实指向同一块内存里的数组,不管你修改哪一个,本质上都是在操作同一个东西,自然会导致原数组跟着变。

针对你做神经网络的场景,这里给你几种实用的解决方法:

一维数组用浅拷贝就够了

如果你的数组是一维的(比如单神经元的权重数组),用下面几种方法都能轻松创建独立的副本:

  • 扩展运算符(最简洁的写法):
    const copyArr = [...originalArr];
    
  • Array.from()方法:
    const copyArr = Array.from(originalArr);
    
  • slice()方法(不传参数就是复制整个数组):
    const copyArr = originalArr.slice();
    

多维数组必须用深拷贝

神经网络里肯定会用到多维数组(比如层与层之间的权重矩阵),这时候上面的浅拷贝就不管用了——因为嵌套的子数组依然是引用类型,修改子数组还是会影响原数组。这时候可以用:

  • JSON序列化反序列化(简单粗暴,注意不能处理函数、undefined这类特殊值,不过神经网络的权重一般都是数字,完全适用):
    const copyArr = JSON.parse(JSON.stringify(originalArr));
    
  • 手写递归深拷贝函数(更灵活,能处理复杂嵌套结构):
    function deepCopy(arr) {
      return arr.map(item => Array.isArray(item) ? deepCopy(item) : item);
    }
    const copyArr = deepCopy(originalArr);
    

用这些方法创建的副本,再修改的时候就不会影响原数组了,正好能满足你神经网络里更新权重、保留原始参数这类需求~

内容的提问来源于stack exchange,提问作者Aden Power

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:22:22