通过引用混淆进行分配

时间:2018-07-29 19:38:26

标签: javascript

我有一个“交易”对象,其中包含对orderBook.BTCUSDT的引用。我的意图是在更改orderBook.BTCUSDT时更改“交易”。

但是,更改orderBook.BTCUSDT不起作用。但是更改orderBook.BTCUSDT.asks可以。

为什么?

orderBook = {'BTCUSDT': {'asks':[1,2,3,5], 'bids':[6,7,8,9]}};
trades = {"one": orderBook.BTCUSDT};
orderBook.BTCUSDT = 1234; // does not work
console.log(trades);

/* Output:
{
  "one": {
    "asks": [
      1,
      2,
      3,
      5
    ],
    "bids": [
      6,
      7,
      8,
      9
    ]
  }
}
*/

orderBook = {'BTCUSDT': {'asks':[1,2,3,5], 'bids':[6,7,8,9]}};
trades = {"one": orderBook.BTCUSDT};
orderBook.BTCUSDT.asks = 1234; // works
console.log(trades);

/* Output:
{
  "one": {
    "asks": 1234,
    "bids": [
      6,
      7,
      8,
      9
    ]
  }
}
*/

在Axiac和Artur回复后进行编辑

在阅读了Axiac和Artur的回复后,我发现了另一种提出问题的方法。为什么第一个代码块起作用,而第二个代码块却不起作用?为什么我必须使用“价格”为对象添加另一个级别?似乎两者都试图在不同的级别上做同一件事(用另一个对象替换一个对象,但保留引用)。

orderBook = {BTCUSDT: { prices: {'asks':[1,2,3,5], 'bids':[6,7,8,9]}}};
trades = {one: orderBook.BTCUSDT};
orderBook.BTCUSDT.prices = {'asks':[11,12,13,15], 'bids':[16,17,18,19]};  // trades.one.BTCUSDT.prices is updated as expected 
console.log(trades); 

orderBook = {BTCUSDT: {'asks':[1,2,3,5], 'bids':[6,7,8,9]}};
trades = {one: orderBook.BTCUSDT};
orderBook.BTCUSDT = {'asks':[11,12,13,15], 'bids':[16,17,18,19]};  // trades.one.BTCUSDT is NOT updated as expected 
console.log(trades); 

编辑:突变与重新分配

我相信我在this post内找到了答案。

在上述两个代码块中,将trades.one设置为orderBook.BTCUSDT。

在第二个代码块中,在第三行中对<< em> 重新分配orderBook.BTCUSDT,而在第一行代码中,在第三行中对其进行变异。更改orderBook.BTCUSDT.prices是一个突变,因此不会丢失引用。但是,使用第二个代码块,重新分配会破坏引用。

这是axiac和Artur在没有明确讨论突变VS重新分配的情况下所说的话。

3 个答案:

答案 0 :(得分:5)

此声明:

trades = {"one": orderBook.BTCUSDT};

使trades.one引用与orderBook.BTCUSDT相同的对象(具有属性asksbids的对象)。这样,可以使用两个变量(trades.oneorderBook.BTCUSDT)访问对象。

trades.oneorderBook.BTCUSDT是不同的实体,它们之间没有任何关联。碰巧在上面的语句之后,它们指向同一对象。

下一条语句:

orderBook.BTCUSDT = 1234; // does not work

orderBook.BTCUSDT中放入一个不同的值,并断开其与对象之间的链接。现在,只有使用asks变量才能访问具有bidstrades.one属性的对象。

答案 1 :(得分:5)

orderBook = {'BTCUSDT': {'asks':[1,2,3,5], 'bids':[6,7,8,9]}};
trades = {"one": orderBook.BTCUSDT};

1。 orderBook.BTCUSDT = 1234;

enter image description here

enter image description here

2.orderBook.BTCUSDT.asks = 1234;

enter image description here

enter image description here

答案 2 :(得分:3)

希望这将帮助您直观地了解为什么会出现这种行为。

enter image description here 在第一张图片中,您可以看到如何引用对象。

enter image description here 在第二张图片中,您可以看到通过执行orderBook.BTCUSDT = 1234,您切断了BTCUSDT及其指向的对象的连接  之前,因此不再指向,但是trades仍在引用该对象。