我有一个'交易'对象,其中包含对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重新分配的情况下所说的话.
这个说法:
trades = {"one": orderBook.BTCUSDT};
Run Code Online (Sandbox Code Playgroud)
使得trades.one指代相同的对象orderBook.BTCUSDTDO(具有属性的对象asks和bids).这样,可以使用两个变量(trades.one和orderBook.BTCUSDT)访问对象.
trades.one并且orderBook.BTCUSDT是不同的实体,它们没有任何关联.只是在上面的语句之后它们指向同一个对象.
下一个声明:
orderBook.BTCUSDT = 1234; // does not work
Run Code Online (Sandbox Code Playgroud)
将不同的值放入orderBook.BTCUSDT并打破它与对象之间的链接.现在只能使用变量访问具有asks和bids属性的对象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;
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |