gpt4 book ai didi

Javascript/NodeJS 传递 byref

转载 作者:太空宇宙 更新时间:2023-11-04 03:23:32 25 4
gpt4 key购买 nike

我还在学习 JS。在其他一些语言中,您可以通过引用传递变量,然后在代码中的其他位置修改它们。

为了避免出现大量重复代码,我构建了一系列回调和解析,如下所示:

class MarketData {
constructor() {
//Arrays
this.OneMinuteData = [];
this.ThreeMinuteData = [];
this.initializeCandleData();
}

initializeData() {
var client = new Client();
this._initializeData(60, client, this.OneMinuteData);
this._initializeData(180, client, this.ThreeMinuteData);
}

_initializeData(granularity, client, dataStore) {
client.GetRates({ granularity: granularity }, function(err, msg, data) {
var items = data.map(item => ({
///data mapped here
}));
dataStore = dataStore.concat(items);
}
}

所以本质上我有这个“私有(private)”_initializeData函数,希望传入一个数组并将其添加到数组中,但由于JS传递byval,我无法达到预期的效果(例如,this.OneMinuteData数组没有被修改)。

因此,我目前知道如何解决此问题的唯一方法是为每个单独的数组复制粘贴相同的函数,我发现这非常草率。有更好的方法吗?

最佳答案

but since JS passes byval, I cannot achieve the desired effect (e.g. this.OneMinuteData array is not modified).

虽然 JavaScript 确实按值传递,但在处理对象(包括任何数组)时该值是一个引用。

参见the documentation for concat :

The concat() method is used to merge two or more arrays. This method does not change the existing arrays, but instead returns a new array.

因此,当您说 dataStore = dataStore.concat(items); 时,您将一个新数组分配给本地 dataStore 变量并丢弃旧数组。

在函数之外,原始数组不变。

分配给 OneMinuteData 的数组未修改的原因是您从未修改任何数组。

items 的值推送到 dataStore 中。

dataStore.push.apply(dataStore, items);
<小时/>

注意:GetRates 具有异步函数的签名,因此请确保在对 OneMinuteData 进行修改之前不要尝试检查它们。

关于Javascript/NodeJS 传递 byref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com