2012-02-15 8 views
5

Quindi, ho il codice, non è stato fatto, ma tutto ciò che voglio è visualizzare una casella di avviso se scrivo la parola 'help', e dire qualcos'altro se qualcos'altro è inserito .se l'istruzione in javascript è sempre true

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") 
    } 
}; 

ma, cosa succede, non importa quale, viene visualizzata la prima casella di avviso, anche se si preme Annulla! Come devo risolvere questo ???

+0

Scommetto che questo succede a molte persone ... ottima domanda, non l'ho mai visto qui prima! – Purag

risposta

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

dovrebbe essere:

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

dal 'Help' è "truthy" e così sarà sempre entrato nella prima parte del if.

Naturalmente, anche migliore sarebbe quella di fare un confronto tra maiuscole e minuscole:

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

Esempio:http://jsfiddle.net/qvEPe/

+0

'Help' non è vero in questo caso, perché non c'è '==' - vedere la mia risposta. Tuttavia, 'Help' è vero, perché le stringhe sono 'true' a meno che non ci sia un operatore '=='. –

+2

@TimothyJones: non sono sicuro che sia corretto. In quanto non booleano, "Aiuto" non può essere semplicemente "vero". È forzato a 'true' dopo la valutazione, tuttavia. In altre parole, il tipo di coercizione si verifica indipendentemente dalla presenza di un '=='. –

+0

@AndrewWhitaker Sì, le stringhe vengono convertite in true, a meno che non siano vuote. Tuttavia, la "verità" in Javascript avviene solo quando c'è un "==" presente (la verità è causata dall'algoritmo di confronto dell'uguaglianza astratta, che puoi trovare nella Specifica ECMAScript, 5a edizione 11.9.3). Quindi la stringa '" 0 "' è anche costretta a true a meno che non ci sia un '==' intorno. È fuorviante descrivere le stringhe in generale come veritiere o meno - dal momento che la verità avviene solo in "==" confronti. –

1

Il motivo per cui si apre sempre è che reply === 'help' || 'Help' valuta come (reply === 'Help') || ('Help'). La stringa letterale Help è sempre veritiera in Javascript, quindi valuta sempre la verità.

Per risolvere questo problema è necessario confrontare reply per entrambi i valori

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

Oppure, se volete comunque variante di aiuto l'uso di un'espressione regolare

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

Il problema è qui:

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

L'operatore di uguaglianza non "distribuisce", prova

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

Basta cambiare questo: if (reply === 'help' || 'Help')

A tal: if (reply === 'help' || reply === 'Help')

La dichiarazione or non è stato confrontando la variabile.

0

Il problema è questa linea:

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

Perché in JavaScript, gli oggetti e le stringhe non vuoti restituiscono true quando viene utilizzato come un valore booleano. Ci sono un paio di eccezioni a questo quando si utilizza ==

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

In generale, non è una buona idea usare == o crude variabili nelle istruzioni if.

Come altri hanno fatto notare, utilizzare

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

O meglio:

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

invece.

+0

Le stringhe non vuote sono sincere, non vere - altrimenti '" stringa "=== true' valuterà a' true'. – nnnnnn

+0

@nnnnnn Hai ragione. Avevo pensato che la maggior parte degli usi della verità in Javascript si riferivano allo "0", ma un rapido google ha dimostrato che non è così. Lo aggiornerò. –

Problemi correlati