我有一个包含对 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 相同的对象(具有 asks
和 bids
属性的对象)。这样,可以使用两个变量( trades.one
和 orderBook.BTCUSDT
)访问该对象。trades.one
和 orderBook.BTCUSDT
是不同的实体,它们没有任何关系。恰好在上面的语句之后,它们指向同一个对象。下一个声明:
orderBook.BTCUSDT = 1234; // does not work
将不同的值放入
orderBook.BTCUSDT
并断开它与对象之间的链接。现在只能使用 asks
变量访问具有 bids
和 trades.one
属性的对象。