【问题标题】:Storing references to values, in arrays, then reassigning the original variable (JavaScript)将值的引用存储在数组中,然后重新分配原始变量(JavaScript)
【发布时间】:2017-08-25 02:04:03
【问题描述】:

这就是我想做的:

我有一个存储状态的对象以及之前状态的数组。

var object = { currentState: [Object], previousStates: [[Object], [Object]] };

当状态发生变化时,我想将当前状态对象的引用存储在以前的状态数组中,以便可以重用,然后创建一个新状态(或重用旧状态)并将其存储在 currentState 中而不更改原始对象传递给数组。如果它有任何区别,状态就是实例化的类对象。

这可能吗?

我查看了很多关于按引用传递和按值传递的资源,但我认为我需要在示例的上下文中对其进行解释。哪个示例将在 currentState 中存储一个新状态而不更改之前推送到数组的值?

function changeState1(states) {
    states.previousStates.push(states.currentState);
    states.currentState = new State();
}

function changeState2(states) {
    var newState = new State();
    states.previousStates.push(states.currentState);
    states.currentState = newState;
}

编辑:

我可能应该提到我的目的是创建高效的代码。如果我可以重用旧实例,我不想动态地从类中重新创建状态。更利于内存使用,减少垃圾回收。

【问题讨论】:

  • “通过引用传递和按值传递的资源” JavaScript 是 按值传递。对象被表示为 引用的事实与传递 by 引用无关。 按值/引用传递描述了绑定(即变量和参数)而不是之间的关系。请参阅en.wikipedia.org/wiki/Evaluation_strategy 了解更多信息。
  • @FelixKling 是的,我在各处都看到过多次提到这一点,但我对语义不感兴趣。我只是想知道我想编写的代码是否可以在 JavaScript 中实现
  • 我不确定我是否理解您想要达到的目标。一个具体的例子会有所帮助。 “但我对语义不感兴趣”好吧,了解正确的语义将帮助您不浪费时间搜索不相关的信息,或误导那些想要帮助您的人。
  • @FelixKling 我添加了一个示例,说明我可以采取哪些措施来解决问题。你是对的语义。我只是觉得这一切都很混乱。
  • 我同意它可能会造成混淆,这就是为什么我认为正确使用语义更为重要:) 您的示例将按照您希望的方式工作。

标签: javascript arrays pass-by-reference javascript-objects pass-by-value


【解决方案1】:

也许是这样的?

var obj = newObjectState; object.previousStates.push(object.currentState); object.currentState = obj;

当然,这都是一种伪代码,但可能是您正在寻找的答案?

【讨论】:

  • 这是我本能的回答,但我注意到一些类似的事情产生了意想不到的影响。例如。我创建了一个对象,然后将两个变量分配为该对象,然后更改了其中一个变量的属性之一。另一个变量的属性也发生了变化。
  • @smmaca:是的,因为对象被表示为引用,所以两个变量都指向同一个对象。但如果变量引用两个不同的对象,就不会发生这种情况。
  • @smmaca:添加到 Felix 的评论中,是的,修改变量的属性将修改引用的对象,正如您所注意到的。但是将变量设置为其他值对对象完全没有影响,只会取消引用。
  • 那是因为 javascript 保存引用的方式,在您的示例中,两个变量都引用同一个对象,它们不是原始对象的副本。这个答案比我解释得更好stackoverflow.com/questions/29050004/…你必须复制你的对象而不是将它们分配给其他变量。
  • @smmaca:我会为 Luis 回答这个问题。不,这没有必要。你的两个changeState 函数都可以工作。只要对象仍然被某个变量引用,内部垃圾回收就不会摆脱它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2023-03-19
  • 1970-01-01
  • 2022-01-02
  • 2021-09-10
  • 2015-08-26
相关资源
最近更新 更多