node.js中的数组推送操作

时间:2018-12-06 21:47:53

标签: node.js

我试图构造一个对象数组。推入数组的第一个对象是确定的。但是,当我尝试将第二个对象推入数组时,第一个对象消失了,并且我在数组中得到了第二个对象的两个副本。

有人可以帮助我理解为什么吗?

这是我执行的步骤: $节点-v v8.9.3

> let taxes = [];
undefined
> taxes
[]
> let tax = {}
undefined
> tax
{}
> tax.name='pst';
'pst'
> tax.rate = 0.07;
0.07
> tax.amount = 10.5;
10.5
> tax
{ name: 'pst', rate: 0.07, amount: 10.5 }
> taxes.push(tax);
1
> taxes
[ { name: 'pst', rate: 0.07, amount: 10.5 } ]
> tax.name='gst';
'gst'
> tax.rate = 0.05;
0.05
> tax.amount = 7.5;
7.5
> tax
{ name: 'gst', rate: 0.05, amount: 7.5 }
> taxes
[ { name: 'gst', rate: 0.05, amount: 7.5 } ]
> texes.push(tax);
2
> taxes
[ { name: 'gst', rate: 0.05, amount: 7.5 },
  { name: 'gst', rate: 0.05, amount: 7.5 } ]
> tax
{ name: 'gst', rate: 0.05, amount: 7.5 }

先谢谢了。

Richard Xu

4 个答案:

答案 0 :(得分:0)

taxes [0]和taxs [1]相同的原因是,这两个对象都是对税收对象的引用。因此,如果您更改taxs [0]或taxs [1]或tax对象,它们将具有相同的值。

我可以看到您正在节点REPL中执行此操作,因此,如果需要,可以使用Object.assign函数。使用此功能,您可以复制具有新引用的另一个对象的属性及其值。如果您更改税额,则不会影响其他对象。

taxes.push(Object.assign({}, tax));

答案 1 :(得分:0)

实际上,当您将tax定义为一个对象,并为其分配一些值,然后推送到数组tax,然后再分配另一个tax值时,您将丢失第一个值,因为按引用调用的对象意味着您覆盖内存中的相同地址: 尝试这种方式:

答案 2 :(得分:0)

>taxes.push(
>{ name: 'pst', rate: 0.07, amount: 10.5 } 
>);
>taxes.push(
>{ name: 'gst', rate: 0.05, amount: 7.5 } 
>);

答案 3 :(得分:-1)

pwd | c的新(克隆)实例不会被推送到taxs数组中,因此在同一范围内修改tax时,推送的对象仍会保留引用,并且一旦您修改了tax变量它会影响数组中的数据。