我从朋友那里得到了这段代码(下面的小提琴链接)。我试图弄清楚的问题是数组(arr1,它是一个对象数组)自动将索引 0 处的对象的数量属性与索引 2 处的对象组合在一起,如控制台日志中所示。但是,如果我通过将其注释掉来停止对函数 addByPayCodeAndLaborAcc() 的调用,那么它将按应有的方式记录正常数组。请帮助为什么会发生这种情况。应该是吊装的原因吧。
这是小提琴。 http://jsfiddle.net/3ZQNg/
我看到的 console.log
[Object, Object, Object, Object]
0: Object
amount: "0414:54:32"
laboracc: "1"
pcname: "a"
__proto__: Object
1: Object
2: Object
amount: "14:54:32"
laboracc: "1"
pcname: "a"
__proto__: Object
3: Object
length: 4
但是我在代码中的数组是
arr1 = [
{
pcname : "a",
laboracc : "1",
amount : "04"
},
{
pcname : "b",
laboracc : "1",
amount : "777"
},
{
pcname : "a",
laboracc : "1",
amount : "14:54:32",
},
{
pcname : "c",
laboracc : "2",
amount : "23"
}];
为什么索引 0 处的对象的数量属性会自动附加到索引 2 处的对象的数量属性?
解决方案 :我找到了原因。当对象被复制时,它们是通过引用复制的。也就是说,同一个对象保留在堆中,并且仅复制其引用,这与按值复制的主要变量类型(如 Number 或 String)不同(即创建了一个新副本)。最初 uiqueRows 是 []。selectedTotals 数组中的第一个对象(带有 pcname a)然后被复制到 uniqueRows(通过引用复制 - 因此 uniqueRows[0] 现在与 selectedTotals[0] 相同)。然后我们将第二个对象添加到 uniqueRows。当我们来到具有相同 pcname“a”的第三个对象时,摘要对象被设置为 uniqueRows[0](与 selectedTotals[0] 相同)。因此,当 summary.amount 实际上更新时 selectedRows[0] 的数量属性正在更新(因为它们引用堆中的相同对象)。
请参考更新后的小提琴中的 console.logs。日志表明返回为“summary”的对象与 selectedTotals[0] 相同,因此在日志 http://jsfiddle.net/3ZQNg/1/中打印“true”