2017-07-18 36 views
1
var check = true; 
var number = Math.floor(Math.random() * 20); 

while (check === true){ 
var guess = prompt("I picked a number 0 to 20, try to guess it!"); 
if (number === guess) { 
    print("You guessed correctly! Good job!"); 
    check = false; 
} 
else if (number < guess) { 
    print("\n\You guessed too high!"); 
} 
else if (number > guess) { 
    print("\n\You guessed too low!"); 
} 
else { 
    print("\n\Error. You did not type a valid number"); 
    exit(); 
} 
    print("\n\Guess: " + guess + "."); 
} 

當我嘗試運行這個程序時,我一直得到正確答案,但它不起作用!即使隨機生成的數字是13,我猜測13,它會通過,它會說它是無效的。Javascript:爲什麼我的值不會相等?

+0

'print','exit()'? – j08691

+1

我以前見過這些方法。不記得它在高中的名字,他們有一個超級簡單的運行時環境設置爲JavaScript,所以學習者不必處理瀏覽器或node.js的複雜環境。 –

+0

我使用的打印命令,因爲我使用的網站使用打印,而不是console.log – MkayBye

回答

2

你的猜測是一個字符串。這是你需要將其轉換爲數字,以便能夠將其與你的猜測比較用戶輸入的文本,以便更換

var guess = prompt("I picked a number 0 to 20, try to guess it!"); 

var guess = Number(prompt("I picked a number 0 to 20, try to guess it!"); 

這將打開你的猜測從您的如果用戶沒有正確格式化,則將其轉換爲數字或特殊值NaN。

您也可以使用==運算符,它會自動在類型之間進行轉換。如果您是JavaScript新手,我會建議您不要使用該操作符,因爲它可能會產生一些令人困惑和意外的行爲。

+0

Number(someValue)的簡寫形式是'+ someValue',它被稱爲[一元加運算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators# Unary_plus_()) –

+0

這是真的。但我認爲它的可讀性較差。 編輯:不具有javascript經驗的人可讀。 –

1

您正在比較prompt(字符串)的返回值與返回值Math.floor(數字)。

由於您使用的是===,它們是不同的數據類型,因此永遠不會匹配。

使用==或明確地將數字轉換爲字符串,反之亦然。

number === +guess 
+0

我認爲可以改善你的答案的幾點:1)提及什麼'+'是2)可能更謹慎的投入值分配給「猜測」,而不是在嚴格的平等測試中使用。 –

0

您正在使用triple =運算符來檢查類型是否相等。當您將提示值(您的guess變量)與您的number變量進行比較時。您正在比較StringNumber。爲了使這項工作,你可以使用

number == guess

Number(guess)

+0

使用數字(猜測),因爲建議使用===。 –

0

你使用全等比較,這也比較類型。 prompt返回字符串值。使用parseInt轉換爲數字。

var guess = prompt("I picked a number 0 to 20, try to guess it!"); 
guess = parseInt(guess, 10); 

第二個參數告訴數字基數(10代表十進制數,16代表十六進制數等)。在非嚴格模式下(又名馬虎模式),在解析帶前導零的字符串時,可能會意外轉換爲八進制(基數爲8)。總是指定基地以避免這種情況。您可能需要learn more about JavaScript strict mode

+0

我想你的意思是說「你可能會遇到意外的_base轉換爲八進制」。此外,沒有人稱之爲「馬虎模式」,它只是「非嚴格模式」。您可能還想知道,ECMAScript 6版規範在默認情況下將'parseInt()'的定義更新爲缺省值爲10,因此這不再是一個問題,除非在舊版Internet的不兼容瀏覽器資源管理器。 –

+0

對不起「實驗」與「體驗」混合。我編輯了我的答案。 – Watilin

1

===是嚴格鍵入的,因此它不會將int與字符串進行比較。

將猜測轉換爲整數。您應該首先驗證它,以防用戶輸入的內容不是int。

var guessInt = +guess; // the plus converts to an integer 
if(isNaN(guessInt)) 
    continue; 
if (number === guessInt) { 
    print("You guessed correctly! Good job!"); 
    check = false; 
} 
相關問題