2012-02-15 65 views
5

所以,我有代碼,它沒有完成,但我希望它做的是顯示一個警告框,如果我寫'幫助'這個詞,並說別的東西,如果還有其他東西輸入。如果在JavaScript語句總是爲真

function prompter() { 
var reply = prompt("This script is made to help you learn about new bands, to view more info, type help, otherwise, just click OK") 
if (reply === 'help' || 'Help') 
    { 
    alert("This script helps you find new bands. It was originally written in Python 3.0.1, using Komodo IDE, but was then manually translated into Javascript. Please answer the questions honestly. If you have no opinion on a question, merely press OK without typing anything.") 
    } 
else 
    { 
    alert("Press OK to continue") 
    } 
}; 

但是,發生了什麼,是無論什麼時候,第一個警告框彈出,即使按取消! 我應該如何解決這個問題?

+0

我敢打賭,這發生在很多人身上......偉大的問題,我從來沒有見過這裏在這裏! – Purag 2012-02-15 23:30:12

回答

11
if (reply === 'help' || 'Help') 

應該是:

if (reply === 'help' || reply === 'Help') 

因爲'Help'是 「truthy」 等等if的第一部分將始終進入。

當然,更好的將是做一個區分大小寫的比較:

if (reply.toLowerCase() === 'help') 

例子:http://jsfiddle.net/qvEPe/

+0

'幫助'在這種情況下不是真的,因爲沒有'==' - 請參閱我的答案。然而,'幫助'是真實的,因爲字符串是'真',除非有'=='運算符。 – 2012-02-15 23:35:26

+2

@TimothyJones:我不確定這是否正確。作爲一個非布爾值,「幫助」不能簡單地爲「真實」。然而,評估時,它被強迫爲「真實」。換句話說,無論是否存在'==',都會發生類型強制轉換。 – 2012-02-15 23:41:15

+0

@AndrewWhitaker是的,字符串被強制爲真,除非它們是空的。然而,Javascript中的'真理'只有在存在'=='時纔會發生(真實性是由抽象平等比較算法引起的,您可以在ECMAScript規範第5版11.9.3中找到這一點)。所以字符串「0」也被強制爲真,除非有'=='左右。將字符串描述爲真或假是錯誤的 - 因爲真實性只發生在'=='比較中。 – 2012-02-15 23:47:42

1

之所以總是彈出是reply === 'help' || 'Help'評估爲(reply === 'Help') || ('Help')。字符串文字Help在Javascript中總是很真實,因此它總是評估爲truthy。

要解決這個問題,你需要比較reply這兩個值

if (reply === 'help' || reply === 'Help') { 
    ... 
} 

或者,如果你想幫助使用任何情況下,變體的正則表達式

if (reply.match(/^help$/i)) { 
    ... 
} 
2

的問題是在這裏:

if (reply === 'help' || 'Help') // <-- 'Help' evaluates to TRUE 
           //  so condition is always TRUE 

平等運營商不「分配」,嘗試

if (reply === 'help' || reply === 'Help') 
1

只要改變這一點: if (reply === 'help' || 'Help')

要這樣: if (reply === 'help' || reply === 'Help')

or聲明不能用來比較的變量。

0

的問題是這一行:

if (reply === 'help' || 'Help') 

因爲在JavaScript中,作爲一個布爾值時對象和非空字符串評估爲true。有幾個例外的使用==

if("0") // true 
if("0" == true) // false 

一般情況下,它不是在if語句使用==或生變數是個好主意。

正如其他人所指出的那樣,使用

if (reply === 'help' || reply === 'Help') 

或者更好:

if (typeof reply === 'string' && reply.toLowerCase() === 'help') 

代替。

+0

非空字符串是真的,不正確 - 否則''字符串「===真」將評估爲「真」。 – nnnnnn 2012-02-16 00:04:31

+0

@nnnnnn你說得對。我曾認爲Javascript中的大部分truthy用法也被稱爲「0」,但一個快速的谷歌表明情況並非如此。我會更新它。 – 2012-02-16 00:11:17