在AngularJS中,将一个变量初始化为另一个变量,而不会在以后对前者的修改影响后者

Initializing variable as equal to another without having future changes to the former affect the latter in AngularJS

本文关键字:变量 影响 修改 AngularJS 初始化 一个 另一个      更新时间:2023-09-26

我知道,当涉及到HTML中显示的变量时,人们大多会提到双向绑定,但我一直遇到同样的问题,并意识到我不理解Angular的一些基本问题。

为了回答这个问题,我目前正在开发一款RPG浏览器游戏。我希望每个字符都有basestat,表示为:
'baseStats' : {
    'defense' : 5,
    'strength' : 3,
    'speed' : 7
}

但是在战斗过程中,它们可能会被"buff"或"debuffed",所以我希望能够在不永久改变角色属性的情况下跟踪这些变化,所以baseStats的存在是为了保持属性的"原始"状态。

vm.restoreAll = function() {
  angular.forEach(vm.activeAllies, function(ally) {
    ally.stats.defense = ally.baseStats.defense;
    ally.stats.strength = ally.baseStats.strength;
    ally.stats.strength = ally.baseStats.speed;
  });
};

这完全是我想要的。这些状态都重置为baseStat

vm.restoreAll = function() {
  angular.forEach(vm.activeAllies, function(ally) {
     ally.stats = ally.baseStats;
  });
}

这显然更具可读性和简洁,但不幸的是,如果我做了改变。从应用程序的其他地方获取的,这些更改也会影响basestat。我很困惑为什么会这样,因为它们看起来实际上是相同的东西。

你的问题不是针对Angular的,而是针对Javascript的。当你将对象值传递给不同的变量时,你并没有传递实际的对象值,而只是传递对对象的引用。因此,对象值本身只存在于内存中的一个位置,每个变量都包含对该位置的引用。

这篇博文进一步解释:http://nsono.net/javascript-pass-by-value-or-pass-by-reference/

正如其他的注释所解释的那样,使用Angular的copy函数会导致一个全新的对象被创建并存储在内存中,从而解决你的问题。

也有各种非angular克隆对象的方法,其中一些在这里描述:http://heyjavascript.com/4-creative-ways-to-clone-objects/

可能是最简洁的:JSON.parse(JSON.stringify(myObject))