首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用式混淆转让

引用式混淆转让
EN

Stack Overflow用户
提问于 2018-07-29 19:38:26
回答 3查看 94关注 0票数 4

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

但是,更改orderBook.BTCUSDT不起作用。但是改变orderBook.BTCUSDT.asks是有意义的。

为什么?

代码语言:javascript
复制
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的回答后,我找到了另一个问问题的方法。为什么第一个代码块工作而不是第二个代码块呢?为什么我要用“价格”来增加对象的另一层呢?似乎两者都在尝试做相同的事情(用另一个对象替换一个对象,但保留引用),只是在不同的级别上。

代码语言:javascript
复制
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所说的,但没有明确讨论突变与重新分配的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-29 19:46:11

本声明如下:

代码语言:javascript
复制
trades = {"one": orderBook.BTCUSDT};

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

trades.oneorderBook.BTCUSDT是不同的实体,它们在任何方面都不相关。只是在上面的语句之后,它们指向同一个对象。

下一份声明:

代码语言:javascript
复制
orderBook.BTCUSDT = 1234; // does not work

orderBook.BTCUSDT中放置不同的值,并断开它与对象之间的链接。具有asksbids属性的对象现在只能使用trades.one变量访问。

票数 5
EN

Stack Overflow用户

发布于 2018-07-29 19:50:19

代码语言:javascript
复制
orderBook = {'BTCUSDT': {'asks':[1,2,3,5], 'bids':[6,7,8,9]}};
trades = {"one": orderBook.BTCUSDT};

1. orderBook.BTCUSDT = 1234;

2.orderBook.BTCUSDT.asks = 1234;

票数 5
EN

Stack Overflow用户

发布于 2018-07-29 20:03:34

希望这能帮助你从视觉上理解为什么你会有这种行为。

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

在第二张图片中,您可以看到,通过执行这个orderBook.BTCUSDT = 1234,您可以切断BTCUSDT的连接和它之前所指向的对象,因此它不再指向,但是trades仍然在引用该对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51583906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档