js最后一个数组项是未定义的

时间:2015-10-08 10:56:47

标签: javascript arrays

我正在尝试制作一个刽子手游戏,一开始游戏会询问用户这个词。一旦有了单词,它就会使用for循环在一个数组中逐个填充单词字母。不幸的是,由于某种原因总是未定义最后一个数组元素。 代码(JS):

for(i=0;i<word.length;i++)
{
    if(i == word.length - 1)
    {
        wordLettersLeft = word.length;
        $("#cEText").removeAttr("style");
        $(".characterEnter").removeAttr("style");
        $("#gBtn").text("Lopeta");
        gameStarted = true;
        pcArrayLength = pcArray.length;
        lives = 4;
        alert("Peli alkaa! Sinulla on " + lives + " yritystä jäljellä.");
        alert("Vihje: " + hint);
        alert("Sinulla on vielä " + wordLettersLeft + " arvattavaa kirjainta jäljellä.");
    }
    else
    {
        pcArray.push(word[i]);
    }
}

3 个答案:

答案 0 :(得分:1)

让我们说某人输入“&#34;测试&#34;”这个词。对于i === 3这是最后一次迭代,您输入了if子句,并且您错过了else子句,这是您正在执行的操作:

pcArray.push(word[i]);

无论您是if还是else,无论如何都要执行此操作,因此您可以放弃else条款并执行此操作反正。

答案 1 :(得分:1)

这有一个非常简单的原因:您没有在pcArray添加最后一个字母。让我们假设我们的单词是'bird'(因为bird 一个单词)。你的代码将通过字母b,i和r并将它们推送到你的数组,到目前为止一切顺利。但是当它到达d时,它位于word.length-1位置 - 因为数组长度从1开始但索引从0开始。你的if语句阻止它将最后一个字母推到单词上。有两种解决方案:

首先,您只需删除else声明:

for(i=0;i<word.length;i++){
    if(i == word.length - 1){
        wordLettersLeft = word.length;
        $("#cEText").removeAttr("style");
        $(".characterEnter").removeAttr("style");
        $("#gBtn").text("Lopeta");
        gameStarted = true;
        pcArrayLength = pcArray.length;
        lives = 4;
        alert("Peli alkaa! Sinulla on " + lives + " yritystä jäljellä.");
        alert("Vihje: " + hint);
        alert("Sinulla on vielä " + wordLettersLeft + " arvattavaa kirjainta jäljellä.");
    }
    pcArray.push(word[i]);
}

每次都会推送每一封信!但是,有一种更有效的方法:

  for(i=0;i<word.length;i++)
      pcArray.push(word[i]);
  wordLettersLeft = word.length;
  $("#cEText").removeAttr("style");
  $(".characterEnter").removeAttr("style");
  $("#gBtn").text("Lopeta");
  gameStarted = true;
  pcArrayLength = pcArray.length;
  lives = 4;
  alert("Peli alkaa! Sinulla on " + lives + " yritystä jäljellä.");
  alert("Vihje: " + hint);
  alert("Sinulla on vielä " + wordLettersLeft + " arvattavaa kirjainta jäljellä.");

这样您只需执行一次初始代码 ,而不是每次都检查if。你知道你的循环只会在有字母的情况下运行,所以为什么甚至打扰if?

正如@Shilly在评论中提到的那样,你可以通过这样做完全放弃for循环:

pcArray = word.split('');

答案 2 :(得分:0)

循环的最后一步不会执行pcArray.push(word[i]);。如此明显,最后的价值就不见了。

但是如果你想将一个字符串转换成一个数组,那就这样做:

var pcArray = word.split('');