繁体   English   中英

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

[英]Why are these two If-statements not the same?

我刚刚开始学习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语句,则剩余的猜测将无法正确计算。 你能告诉我有什么区别吗?

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

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

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

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

你可以这样做

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

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

问题在这里:

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

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

if (!this.guessedLetters.includes(guess)

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

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

// 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 ,然后才修改guessedLettersremainingGuesses guessedLetters if子句然后检查未修改的guessedLetters集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM