javascript - 函数在不应该设置变量时设置变量

标签 javascript arrays variables return

function genEnemy(a) {
 //javascript:alert(en[0]+'\n'+genEnemy(en[0])+'\n'+en[0])
 with (Math) {
  a[1]=round(a[1]*(.5+random()))
  a[2]=round(a[2]*(1+random()))
  for (var b=0;b<5;b++) a[3][b]=round(a[3][b]*(a[3][b]/2+random()*a[3][b]/10))
  for (var b=0;b<a[4].length;b++) random()<it[a[4][b]][3]/10?a[4][b]=0:0
  }
 return a
 }

根据每个敌人阵列的基地生成敌人统计数据的脚本。 ( Angular 色扮演游戏) 问题是,当我期望它返回一个包含新统计数据的数组时,它还将敌人数组设置为新数组。为什么是这样?显然你可以看到由此造成的问题(基地被改变,这样弱小的敌人就可以变得 super 强大)。我如何阻止它在 en (敌人值数组)中设​​置数组?

最佳答案

在 JavaScript 中对象是通过引用传递的。这意味着您对 genEnemy 内的数组 a 所做的任何更改都会反射(reflect)在传入的原始数组上。您需要制作该数组的深拷贝并返回此副本复制。这是一个可以为您完成此操作的函数:

function cloneArray(a) {
  var b = [];
  for (var i = 0; i < a.length; i++)
    if (a[i] instanceof Array)
      b[i] = cloneArray(a[i]);
    else
      b[i] = a[i];
  return b;
}

genEnemy内,你可以这样做:

a = cloneArray(a);
// make changes to the new array
return a;

另外,不要忘记在代码中包含分号。尽管它们是可选的,但如果您养成忽略它们的习惯,您可能会遇到意想不到的问题。

关于javascript - 函数在不应该设置变量时设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180504/

相关文章:

javascript - JS中的变量变量

c# - 如何获取动态编译的C#代码的变量值

c - 没有变量名称?

python - 二维数组中的 NaN 插值。人口稀少

javascript - React/Redux - 前一个操作完成后触发操作

javascript - 如何将 session 值从 aspx(使用 javascript 存储)传递到 cs

javascript - Laravel 和 Dropzone.js 文件请求

arrays - 如何在 Perl 中正确替换哈希数组中的值?

javascript - 合并相同级别的数组

javascript - 如何防止覆盖事件监听器