Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数组中存储对值的引用,然后重新分配原始变量(JavaScript)_Javascript_Arrays_Pass By Reference_Javascript Objects_Pass By Value - Fatal编程技术网

在数组中存储对值的引用,然后重新分配原始变量(JavaScript)

在数组中存储对值的引用,然后重新分配原始变量(JavaScript),javascript,arrays,pass-by-reference,javascript-objects,pass-by-value,Javascript,Arrays,Pass By Reference,Javascript Objects,Pass By Value,这就是我想做的: 我有一个对象,它存储一个状态和一个以前状态的数组 var object={currentState:[object],以前的状态:[[object],[object]} 当状态更改时,我希望将对currentState对象的引用存储在前一个状态数组中,以便可以重用它,然后创建一个新状态(或重用旧状态)并将其存储在currentState中,而不更改传递给数组的原始对象。如果有任何区别,状态就是实例化的类对象 这可能吗 我已经看过很多关于按引用传递和按值传递的参考资料,但是我认为

这就是我想做的:

我有一个对象,它存储一个状态和一个以前状态的数组

var object={currentState:[object],以前的状态:[[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;
}
编辑:


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

可能是这样的吗

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


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

可能是这样的

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



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

“关于按引用传递和按值传递的资源”JavaScript是按值传递的。对象表示为引用的事实与按引用传递无关。传递值/引用描述绑定(即变量和参数)与值之间的关系。有关更多信息,请参阅。@FelixKling是的,我在任何地方都见过多次提到这一点,但我对语义不感兴趣。我只是想知道我想用JavaScript编写的代码是否可行,我不确定我是否真正理解您想要实现的目标。一个具体的例子会有所帮助。“但我对语义学不感兴趣”好吧,了解正确的语义学将帮助你避免浪费时间搜索无关信息,或误导那些想帮助你的人。@FelixKling我已经添加了一个例子,说明我可以如何解决这个问题。关于语义你是对的。我只是觉得这一切都很让人困惑。我同意这可能会让人困惑,这就是为什么我认为正确的语义更重要:)你的示例将按照你希望的方式工作。“关于按引用传递和按值传递的参考资料”JavaScript是按值传递的。对象表示为引用的事实与按引用传递无关。传递值/引用描述绑定(即变量和参数)与值之间的关系。有关更多信息,请参阅。@FelixKling是的,我在任何地方都见过多次提到这一点,但我对语义不感兴趣。我只是想知道我想用JavaScript编写的代码是否可行,我不确定我是否真正理解您想要实现的目标。一个具体的例子会有所帮助。“但我对语义学不感兴趣”好吧,了解正确的语义学将帮助你避免浪费时间搜索无关信息,或误导那些想帮助你的人。@FelixKling我已经添加了一个例子,说明我可以如何解决这个问题。关于语义你是对的。我只是觉得这一切都很让人困惑。我同意这可能会让人困惑,这就是为什么我认为正确的语义更重要:)你的例子会像你希望的那样工作。这是我本能的回答,但我注意到一些类似的事情会产生意想不到的影响。例如,我创建了一个对象,然后为该对象分配了两个变量,然后更改了其中一个变量的一个属性。另一个变量的属性也更改了。@smmaca:是的,因为对象表示为引用,所以两个变量都指向同一个对象。但是如果变量引用两个不同的对象,就不会发生这种情况。@smmaca:要添加到Felix的注释中,是的,修改变量的属性将修改引用的对象,正如您所注意到的。但是将变量设置为其他变量对对象没有任何影响,只会取消引用。这是因为javascript保存引用的方式,在您的示例中,两个变量都引用同一个对象,它们不是原始对象的副本。这个答案比我更能解释为什么你必须复制你的对象,而不是将它们分配给其他变量。@smmaca:我会为路易斯回答这个问题。不,没有必要。这两个
changeState
功能都可以工作。只要对象仍然被某个变量引用,内部垃圾收集就不会将其清除。这是我本能的回答,但我注意到一些类似的事情产生了意想不到的影响。例如,我创建了一个对象,然后为该对象分配了两个变量,然后更改了其中一个变量的一个属性。另一个变量的属性也更改了。@smmaca:是的,因为对象表示为引用,所以两个变量都指向同一个对象。但是如果变量引用两个不同的对象,就不会发生这种情况。@smmaca:要添加到Felix的注释中,是的,修改变量的属性将修改引用的对象,正如您所注意到的。但是将变量设置为其他变量对对象没有任何影响,只会取消引用。这是因为javascript保存引用的方式,在您的示例中,两个变量都引用同一个对象,它们不是原始对象的副本。这个答案比我解释得更清楚你要复印吗