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

修改数组中一个元素后所有元素同步更新的原因排查

为何修改数组中单个对象的数组元素后,所有对象的对应值同步变化?

我在制作JS动画时遇到问题:修改数组内某对象的数组元素后,所有数组元素的对应值都被更新了。以下是简化的问题复现代码:

function Rect(x, y, s, c) {
    this.x = x,
    this.y = y,
    this.s = s
    this.c = c;
}

function start() {
    let rects = [];
    let c = [0,0,0];
    let x = 0;

    for (i = 0; i < 10; i++) {
        rects.push(new Rect(x, 50, 100, c));

        x += 110;
    }

    document.getElementById("txt0").innerHTML = "Values before value change";
    document.getElementById("txt1").innerHTML = rects[0].c;
    document.getElementById("txt2").innerHTML = rects[1].c;

    // 修改其中一个数组元素的值
    rects[0].c[0] = 1;

    document.getElementById("txt3").innerHTML = "Values after value change";
    
    // 为什么所有数组元素的值都变了?
    document.getElementById("txt4").innerHTML = rects[0].c;
    document.getElementById("txt5").innerHTML = rects[1].c;
    
}

window.onload = start;

我改写了另一个简化示例,却没有复现这个问题:

function My_constructor() {
  this.my_array = [0, 0, 0];
}


let my_objects = [];
for (i = 0; i < 10; i++) { my_objects.push(new My_constructor()); }



// 打印数组中的第0和第1个对象
document.getElementById("txt1").innerHTML = my_objects[0].my_array;
document.getElementById("txt2").innerHTML = my_objects[1].my_array;

// 修改其中一个对象的参数
my_objects[0].my_array[0] = 1;

document.getElementById("txt3").innerHTML = my_objects[0].my_array;
document.getElementById("txt4").innerHTML = my_objects[1].my_array;

我排查后发现,第一个示例的循环中把变量放入数组时,创建的是该变量的引用而非副本,修改时实际改变的是引用指向的对象,所以所有引用该对象的元素都会同步变化。但为什么两个示例的表现不一样?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:50:54