2016-01-09 75 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);