[英]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()
方法产生不同的结果。
如果您将其翻译为“普通”英语,请尝试自行取消贬义:
这样说 如果猜测不在猜测中,则将其添加,第二个条件将自动为假,因为您只是将猜测添加到了猜测列表中,因此它不在不在猜测列表中。
你可以这样做
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--
}
在原始模型中,他们首先计算两个标志isUnique
和isBadGuess
,然后才修改guessedLetters
和remainingGuesses
guessedLetters
。 if
子句然后检查未修改的guessedLetters
集合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.