纯Javascript,无法将变量分配给数组

时间:2018-11-30 04:32:05

标签: javascript

我仍在学习JS(不是jquery)。因此,在学习中,我从一个简单的游戏开始。我发现了一个问题。我无法使这些数组正常工作,因为它们正在生成NaN

var clickMultiplier = 1.11;
var idleMultiplier = 1.15;
var idleBuffsCost = [];
idleBuffsCost[0] = 100;
var clickBuffsCost = [];
clickBuffsCost[0] = 100;
var trainerBuffsCost = [];
trainerBuffsCost[0] = 1250;

for (i = 1; i <= 20; i++) {
  var j = i - 1;
  idleBuffsCost[i] += idleBuffsCost[j] * idleMultiplier;
  clickBuffsCost[i] = clickBuffsCost[i] + clickBuffsCost[j] * clickMultiplier;
  trainerBuffsCost[i] += trainerBuffsCost[j] * 1.25;
}
console.log(clickBuffsCost[0]); // works = 100
console.log(clickBuffsCost[1]); // does not work NaN

我在做什么错? 而且,我习惯做数组(如上面)

... idleBuffsCost[i-1]

但是,这似乎不起作用。 你怎么看?我没有看到树木的森林吗(我通常使用php / mysql / pascal / qb64(和其他派生语言)和其他几种语言编程-只是将JS添加到列表中哈哈哈)

ps不同的分配是因为我尝试了不同的逻辑运算。

感谢这里的一些人-我犯了一个简单的错误。循环试图为尚未分配的索引分配值。这是解决方法-我删除了+ =,只剩下=

idleBuffsCost[i] = idleBuffsCost[j] * idleMultiplier;
clickBuffsCost[i] = clickBuffsCost[j] * clickMultiplier;
trainerBuffsCost[i] = trainerBuffsCost[j] * 1.25;

特别感谢:@ certainPeformance,@ Wais Kamal和@David我希望我能对它们全部进行绿色检查。但是,尽管如此,他们还是很有帮助的,谢谢大家!

3 个答案:

答案 0 :(得分:2)

您的代码中有一个小错误。搜索此行代码。

clickBuffsCost[i] = clickBuffsCost[i] + (clickBuffsCost[j] * clickMultiplier);

更改为:

clickBuffsCost[i] = clickBuffsCost[j] + (clickBuffsCost[j] * clickMultiplier); // notice the difference after the = part

由于i将从1开始,所以clickBuffsCost[1]未定义,因为clickBuffsCost开头仅包含一个项目。

答案 1 :(得分:1)

这是您出问题的地方:

for (i = 1; i <= 20; i++) {
  var j = i - 1;
  idleBuffsCost[i] += idleBuffsCost[j] * idleMultiplier;
  clickBuffsCost[i] = clickBuffsCost[i] + (clickBuffsCost[j] * clickMultiplier);
  trainerBuffsCost[i] += trainerBuffsCost[j] * 1.25;
}

首先,在使用前定义i。定义变量是好的编程习惯。

clickBuffsCost[i] = clickBuffsCost[i] + (clickBuffsCost[j] * clickMultiplier);

在循环的第一次迭代中,i的值为1,而j的值为0。您正在将clickBuffsCost的第二个元素设置为clickBuffsCost[i] + (clickBuffsCost[j] * clickMultiplier)clickBuffsCost[i](在这种情况下等于clickBuffsCost[1])是未定义的,这就是为什么在调用console.log(clickBuffsCost[0])时得到NaN的原因。

答案 2 :(得分:-4)

您需要初始化数组长度。例如,如果您知道数组中有20个元素,则应按以下方式初始化数组:

StringBuffer

或者,如果您不知道数组的长度,则可以使用数组const testArr = new Array(20);函数,而不是为数组的ith元素建立索引并为其分配值,而不是使用它。此方法意味着您不必初始化具有长度的数组。

您可以在此处了解更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array