为什么这两个If陈述不相同?

时间:2018-11-30 12:37:40

标签: javascript if-statement

我刚刚开始学习Javascript。目前,我正在上在线课程,遇到了我不明白的第一个问题。

我想检查在Hangman游戏中我还有多少猜测:

const Hangman = function(word, remainingGuesses) {
  this.word = word.toLowerCase().split('')
  this.remainingGuesses = remainingGuesses
  this.guessedLetters = []
}

Hangman.prototype.getPuzzle = function() {
  let puzzle = ''

  this.word.forEach((letter) => {
    if (this.guessedLetters.includes(letter) || letter === ' ') {
      puzzle += letter
    } else {
      puzzle += '*'
    }
  })

  return puzzle
}

视频中正确的if语句是这样的:

Hangman.prototype.makeGuess = function(guess) {

  const isUnique = !this.guessedLetters.includes(guess)
  const isBadGuess = !this.word.includes(guess)

  if (isUnique) {
    this.guessedLetters.push(guess)
  }

  if (isUnique && isBadGuess) {
    this.remainingGuesses--
  }
}

但这是我在下面编写if语句的方式:

Hangman.prototype.makeGuess = function(guess) {


  if (!this.guessedLetters.includes(guess)) {
    this.guessedLetters.push(guess)
  }

  if (!this.guessedLetters.includes(guess) && !this.word.includes(guess)) {
    this.remainingGuesses--
  }
}

如果我以第二种方式执行if语句,则剩余的猜测将无法正确计算。你能告诉我有什么区别吗?

3 个答案:

答案 0 :(得分:2)

在最后一个示例中,您使用guessedLetters方法更改了push()数组。 这可能导致同一数组的includes()方法产生不同的结果。

如果您将其翻译为“普通”英语,请尝试自行取消贬义:

  1. 如果猜测不在猜测列表中,请将其添加到猜测列表中。
  2. 如果猜测不在单词列表中,也不在单词列表中,请减少剩余的猜测

这说。如果猜测中没有猜测,则将其添加,并且第二个条件将自动为假,因为您只是将猜测添加到了猜测列表中,因此它不在不在猜测列表中。

您可以改为这样

if (!this.guessedLetters.includes(guess)) {
    this.guessedLetters.push(guess)

    if (!this.word.includes(guess)) {
       this.remainingGuesses--
    }
}

答案 1 :(得分:2)

问题在这里:

if (!this.guessedLetters.includes(guess)) {
    this.guessedLetters.push(guess)
}

如果this.guessedLetter不包含guess,则会将其添加到列表中(与push一起。)

if (!this.guessedLetters.includes(guess)

您刚刚修改了this.guessedLetters。因此,现在,当您再次检查时,guess始终存在,因此该条件永远不会成立。

答案 2 :(得分:2)

在您的示例中,尝试分析guessedLetters 不包含 guess的情况的流向:

// if the guessedLetters doesn't contain guess ...
if (!this.guessedLetters.includes(guess)) {
    // ... then you add it
    this.guessedLetters.push(guess)
}

// and it already contains guess so the first clause of the if
// is always false
if (!this.guessedLetters.includes(guess) && !this.word.includes(guess)) {
    this.remainingGuesses--
}

在原始版本中,它们首先计算标志isUniqueisBadGuess,然后才修改guessedLettersremainingGuessesif子句然后检查未修改的guessedLetters集合。