Javascript 为什么这两个If语句不一样?

Javascript 为什么这两个If语句不一样?,javascript,if-statement,Javascript,If Statement,我刚开始学习Javascript。目前我正在参加一个在线课程,我遇到了我不理解的第一个问题 我想看看我在一个刽子手游戏中还有多少猜测: const Hangman=函数(单词,剩余猜测){ this.word=word.toLowerCase().split(“”) this.remainingGuesses=remainingGuesses this.guessedLetters=[] } Hangman.prototype.getPuzzle=函数(){ 让益智=“” this.word.f

我刚开始学习Javascript。目前我正在参加一个在线课程,我遇到了我不理解的第一个问题

我想看看我在一个刽子手游戏中还有多少猜测:

const Hangman=函数(单词,剩余猜测){
this.word=word.toLowerCase().split(“”)
this.remainingGuesses=remainingGuesses
this.guessedLetters=[]
}
Hangman.prototype.getPuzzle=函数(){
让益智=“”
this.word.forEach((字母)=>{
如果(此.猜测字母.包括(字母)| |字母==''){
拼图+=字母
}否则{
拼图+='*'
}
})
返回谜题
}
视频中正确的
if
语句如下:

Hangman.prototype.makeGuess=函数(guess){
const isUnique=!this.guessedLetters.includes(guess)
const isBadGuess=!this.word.includes(guess)
如果(是唯一的){
这个。猜字母。推(猜)
}
if(isUnique&&isBadGuess){
这是我的猜测--
}
}
下面是我如何编写
if
语句的:

Hangman.prototype.makeGuess=函数(guess){
如果(!this.guessedLetters.includes(guess)){
这个。猜字母。推(猜)
}
如果(!this.guessedLetters.includes(guess)&&!this.word.includes(guess)){
这是我的猜测--
}
}

如果我以第二种方式执行
if
语句,其余的猜测计算不正确。您能告诉我区别是什么吗?

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

如果您用“普通”英语翻译,请尝试自行取消声明:

  • 如果猜测不在猜测列表中,请将其添加到猜测列表中
  • 若猜测不在猜测列表中且不在单词列表中,则减少剩余猜测
  • 这是说。如果guess不在guess中,您将添加它,第二个条件将自动为false,因为您刚刚将guess添加到猜测列表中,因此它不在猜测列表中

    你可以这样做

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

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

    如果您用“普通”英语翻译,请尝试自行取消声明:

  • 如果猜测不在猜测列表中,请将其添加到猜测列表中
  • 若猜测不在猜测列表中且不在单词列表中,则减少剩余猜测
  • 这是说。如果guess不在guess中,您将添加它,第二个条件将自动为false,因为您刚刚将guess添加到猜测列表中,因此它不在猜测列表中

    你可以这样做

    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

    您刚刚修改了
    这个。猜字母
    。现在,当你再次检查时,
    guess
    总是存在,所以这个条件永远不会成立

    问题在于:

    if (!this.guessedLetters.includes(guess)) {
        this.guessedLetters.push(guess)
    }
    
    如果
    this.guessedLetter
    未包含
    guess
    ,则会将其添加到列表中(使用
    push


    您刚刚修改了
    这个。猜字母
    。现在,当你再次检查时,
    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
    集合。

    在您的示例中,尝试分析
    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
    集合。

    在代码中,在调用
    includes()的第二个
    if
    中。但是,第一个
    if
    可能已经推送了字母,因此
    includes()
    调用的结果不同。在工作代码中,检查是在修改数组之前完成的。@epascarello否,为什么?Hi@P.Walko-如果您想查看代码执行中的步骤,此JS可视化工具非常有用。它将帮助您更好地了解每一步的进展情况,并有望帮助您调试程序。在代码中,在第二个
    if
    中调用
    includes()
    。但是,第一个
    if
    可能已经推送了字母,因此
    includes()
    调用的结果不同。在工作代码中,检查是在修改数组之前完成的。@epascarello否,为什么?Hi@P.Walko-如果您想查看代码执行中的步骤,此JS可视化工具非常有用。它将帮助您更好地了解每一步的进展情况,并有望帮助您调试程序。