我有一个包含对 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。

在第二个代码块中, orderBook.BTCUSDT 被重新分配到第三行,而在第一个代码块中 orderBook.BTCUSDT 在第三行中被改变。更改 orderBook.BTCUSDT.prices 是一种突变,因此引用不会丢失。但是,对于第二个代码块,重新分配会破坏引用。

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

最佳答案

这个说法:

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

使 trades.one 引用与 orderBook.BTCUSDT do 相同的对象(具有 asksbids 属性的对象)。这样,可以使用两个变量( trades.oneorderBook.BTCUSDT )访问该对象。
trades.oneorderBook.BTCUSDT 是不同的实体,它们没有任何关系。恰好在上面的语句之后,它们指向同一个对象。

下一个声明:
orderBook.BTCUSDT = 1234; // does not work

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

10-07 21:49