我有一个“交易”对象,其中包含对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重新分配的情况下所说的话。
答案 0 :(得分:5)
此声明:
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
属性的对象。
答案 1 :(得分:5)
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;
答案 2 :(得分:3)