我刚刚开始学习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
语句,则剩余的猜测将无法正确计算。你能告诉我有什么区别吗?
答案 0 :(得分:2)
在最后一个示例中,您使用guessedLetters
方法更改了push()
数组。
这可能导致同一数组的includes()
方法产生不同的结果。
如果您将其翻译为“普通”英语,请尝试自行取消贬义:
这说。如果猜测中没有猜测,则将其添加,并且第二个条件将自动为假,因为您只是将猜测添加到了猜测列表中,因此它不在不在猜测列表中。
您可以改为这样
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--
}
在原始版本中,它们首先计算标志isUnique
和isBadGuess
,然后才修改guessedLetters
和remainingGuesses
。 if
子句然后检查未修改的guessedLetters
集合。