2016-01-09 34 views
0

我正在尝试学习javascript,并且作为该练习的一部分,我决定尝试创建一个二十一点模拟器来增加我的工具和技能。来自提示的意外行为js

下面是与程序隔离的块。为了简单起见,我使用提示符而不是html界面。

function askAboutAce(){ 
    var nResponse = 0; 
    var response = 0; 
    response = prompt("Would you like to use the ace as a 1 or 11?"); 
    if(response === "1" || response === "11"){ 
     nResponse = Number(response); 
     return nResponse; 
    } 
    else{ 
     askAboutAce(); 
    } 
} 

var x = 2 + askAboutAce(); 
console.log(x); 

该行var x = 2 + askAboutAce();模拟玩家先画一个2,然后画一个Ace。当我执行以下操作时,会出现奇怪的行为:如果提示询问我想如何处理ace,并且我正确响应(即使用1或11),则返回值是一个数字。但是,如果我的反应不正确(通过输入除1或11之外的其他数字),然后最终输入1或11,则返回值为NaN。我发现这种行为很奇怪,并且假设它与解决使用递归引起的一系列行为有关。请帮助我了解意外的行为。

+0

提示返回一个字符串。按取消返回null。你可以使用'nResponse = Number(response)|| 0;'确保你有一个数字来做数学(尤其是加法)。 – dandavis

+0

尝试response = parseInt(prompt())并检查没有引号的情况 –

+0

在上面的场景中,我从未按下取消。我也用'nResponse = Number(response)'行来补偿字符串;' –

回答

2

每个功能在javascipt的有返回值。如果你没有指定任何东西,默认情况下它将是undefined。在'如果'的情况下,你返回的数字是正确的。但在'其他'条件下,你再次调用可能返回一个数字的函数,但由于你没有返回函数调用的结果,所以引擎只会返回undefinedNumber(undefined)NaN。使用undefined的'+'运算符将尝试将其强制转换为数字。关于隐性强制有更多的规则。

在else条件下使用return askAboutAce();

0

这是因为在该块代码...返回

if(response === "1" || response === "11"){ 
    nResponse = Number(response); 
    return nResponse; 
} 
else{ 
    askAboutAce(); 
} 

没有针对else语句。 askAboutAce()的值刚刚返回到...无处。

所以你需要返回该方法的输出。

EX:

else{ 
    return askAboutAce(); 
} 
1

这是个人偏好,但递归在这里并不是真的需要。我认为你的askAboutAce功能更简单,也许更容易遵循的方式是这样的

function askAboutAce(){ 
    var response; 
    do { 
     response = prompt("Would you like to use the ace as a 1 or 11?"); 
    } while (response !== "1" && response !== "11") 

    return Number(response); 

} 

var x = 2 + askAboutAce(); 
console.log(x);