有人能解释以下Javascript代码的行为吗

Can anyone explain the following Javascript code behaviour?

本文关键字:代码 Javascript 能解释      更新时间:2023-09-26

这是我的Javascript代码:

var subRow = [];
var rowarr = [];
subRow.push({ v: "Jay" });
subRow.push({ v: "Ram" });
rowarr.push({ c: subRow });
subRow.length = 0;
subRow.push({ v: "Jay1" });
subRow.push({ v: "Ram1" });
rowarr.push({ c: subRow });
console.log(JSON.stringify(rowarr));

输出为:

    [{
    "c": [{
        "v": "Jay1"
    }, {
        "v": "Ram1"
    }]
}, {
    "c": [{
        "v": "Jay1"
    }, {
        "v": "Ram1"
    }]
}]

预期输出为:

    [{
    "c": [{
        "v": "Jay"
    }, {
        "v": "Ram"
    }]
}, {
    "c": [{
        "v": "Jay1"
    }, {
        "v": "Ram1"
    }]
}]

有人能解释为什么会这样吗?

数组是通过引用处理的。

subRow.length = 0;擦除数组的内容。

rowarr然后包含指向同一数组的两个指针(该数组中只有清空后放入的内容)

subRow.length = 0;更改为subRow = []以处理新阵列,而不是修改现有阵列。

subRow指向一个对象。当您将它push放到rowArr上时,您将创建对该对象的引用。你推它两次,这是对一个对象的两次引用。当您编辑subRow时,对对象的两个引用都会看到更改,所以您践踏了对象的所有旧内容——它们没有存储在其他地方,所以它们完全丢失了。您需要创建一个全新的对象,而不是编辑旧对象。