通过参考混淆分配

Jas*_*onH 4 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
    ]
  }
}
*/
Run Code Online (Sandbox Code Playgroud)

在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); 
Run Code Online (Sandbox Code Playgroud)

编辑:变异与重新分配

我相信我在这篇文章中找到了答案.

在上面的两个代码块中,trades.one设置为orderBook.BTCUSDT.

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

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

axi*_*iac 5

这个说法:

trades = {"one": orderBook.BTCUSDT};
Run Code Online (Sandbox Code Playgroud)

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

trades.one并且orderBook.BTCUSDT是不同的实体,它们没有任何关联.只是在上面的语句之后它们指向同一个对象.

下一个声明:

orderBook.BTCUSDT = 1234; // does not work
Run Code Online (Sandbox Code Playgroud)

将不同的值放入orderBook.BTCUSDT并打破它与对象之间的链接.现在只能使用变量访问具有asksbids属性的对象trades.one.


小智 5

orderBook = {'BTCUSDT': {'asks':[1,2,3,5], 'bids':[6,7,8,9]}};
trades = {"one": orderBook.BTCUSDT};
Run Code Online (Sandbox Code Playgroud)

1. orderBook.BTCUSDT = 1234;

在此输入图像描述

在此输入图像描述

2.orderBook.BTCUSDT.asks = 1234;

在此输入图像描述

在此输入图像描述

  • uuuuh花式+1:D (2认同)