我有一个“交易”对象,其中包含了对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所说的,但没有明确讨论突变与重新分配的问题。
发布于 2018-07-29 19:46:11
本声明如下:
trades = {"one": orderBook.BTCUSDT};使trades.one引用orderBook.BTCUSDT所做的相同对象(具有asks和bids属性的对象)。这样,可以使用两个变量(trades.one和orderBook.BTCUSDT)访问对象。
trades.one和orderBook.BTCUSDT是不同的实体,它们在任何方面都不相关。只是在上面的语句之后,它们指向同一个对象。
下一份声明:
orderBook.BTCUSDT = 1234; // does not work在orderBook.BTCUSDT中放置不同的值,并断开它与对象之间的链接。具有asks和bids属性的对象现在只能使用trades.one变量访问。
发布于 2018-07-29 19:50:19
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;


发布于 2018-07-29 20:03:34
希望这能帮助你从视觉上理解为什么你会有这种行为。

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

在第二张图片中,您可以看到,通过执行这个orderBook.BTCUSDT = 1234,您可以切断BTCUSDT的连接和它之前所指向的对象,因此它不再指向,但是trades仍然在引用该对象。
https://stackoverflow.com/questions/51583906
复制相似问题