javascript中的对象数组自动组合属性

时间:2014-01-04 13:38:21

标签: javascript arrays hoisting

我从朋友那里得到了这个代码(下面的小提琴链接)。我想弄清楚的问题是数组(arr1,它是一个对象数组)自动将索引0处对象的amount属性与索引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处的对象的amount属性会自动附加到索引为2的对象的附加值?

解决方案:我发现了原因。 复制对象时,将通过引用复制它们。这是同一个对象保留在堆中,只复制它的引用,这与由value复制的主要变量类型(如Number或String)(创建新副本)不同。 最初uiqueRows是[]。然后将selectedTotals数组中的第一个对象(带有pcname a)复制到uniqueRows(通过引用复制 - 因此uniqueRows [0]现在与selectedTotals [0]相同)。然后我们将第二个对象添加到uniqueRows。当我们使用相同的pcname“a”来到第三个对象时,summary对象被设置为uniqueRows [0](与selectedTotals [0]相同)。因此,当实际更新summary.amount时,selectedRows [0]的amount属性将更新(因为它们引用堆中的同一对象)。因此附加的值会反映在日志中。

请参阅更新后的小提琴中的console.logs。日志表明返回为“summary”的对象与selectedTotals [0]相同,因此在日志中打印“true” http://jsfiddle.net/3ZQNg/1/

2 个答案:

答案 0 :(得分:1)

addByPayCodeAndLaborAcc认为第一个"a"项是第二项的摘要。它将第一个amount项的"a"字段设置为使用getAmountInTimeOrCurrency计算的奇怪事物,最终将数量连接起来。我不确定为什么你的代码会做这些,但这就是你编写它的方式。

答案 1 :(得分:0)

在Chrome开发工具中,所有对象似乎都返回正确的索引位置:

start (index):127
Array[4]
0: Object
1: Object
2: Object
3: Object
length: 4
__proto__: Array[0]