2012-02-15 16 views
5

Tak, mam kod, nie jest zrobiony, ale wszystko, co chcę zrobić, to wyświetlenie jednego pola alertu, jeśli napiszę słowo "pomoc", i powiedz coś innego, jeśli cokolwiek innego zostanie wprowadzone .jeśli instrukcja w javascript zawsze jest prawdziwa

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

, ale co się dzieje, nie ważne co, pojawi się pierwsze okno alertu, nawet jeśli naciśniesz przycisk anuluj! Jak to naprawić?

+0

Założę się, że tak się dzieje z wieloma osobami ... świetne pytanie, nigdy wcześniej tego nie widziałem! – Purag

Odpowiedz

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

powinno być:

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

od 'Help' jest "truthy", a więc pierwsza część if zawsze będą wprowadzone.

Oczywiście jeszcze lepiej byłoby zrobić bez uwzględniania wielkości liter porównania:

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

Przykład:http://jsfiddle.net/qvEPe/

+0

"Pomoc" nie jest w tym przypadku prawdą, ponieważ nie ma "==" - zobacz moją odpowiedź. Jednak "Pomoc" jest prawdziwa, ponieważ łańcuchy są "prawdziwe", chyba że istnieje operator '=='. –

+2

@TimothyJones: Nie jestem pewien, czy to prawda. Jako nie-boolean, '' Help'' nie może po prostu być "true". Jest jednak zmuszony do "prawdziwości" przy ewaluacji. Innymi słowy, przymus typu występuje bez względu na to, czy występuje '=='. –

+0

@AndrewWhitaker Tak, ciągi są przekształcane na wartość true, chyba że są puste. Jednak "prawidłowa" w JavaScript występuje tylko wtedy, gdy istnieje '==' (prawidłowość jest spowodowana przez algorytm abstrakcyjnego porównywania równości, który można znaleźć w specyfikacji ECMAScript, piąte wydanie 11.9.3). Zatem ciąg '" 0 "' jest również wymuszany na true, chyba że istnieje '==' dookoła. Mylące jest opisywanie ciągów ogólnie jako prawdy lub nie - ponieważ prawidłowość występuje tylko w '==' porównaniach. –

1

Powodem dlaczego to zawsze wyskakuje, że reply === 'help' || 'Help' ocenia jako (reply === 'Help') || ('Help'). Ciąg literalny Help jest zawsze zgodny z prawdą w JavaScript, więc zawsze ocenia to jako prawdę.

Aby to naprawić trzeba porównać reply obu wartości

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

Albo jeśli chcesz żadnym wypadku wariant wykorzystania pomocy regex

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

Problemem jest tutaj:

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

Operator równości nie "rozpowszechnia", spróbuj

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

Wystarczy zmienić: if (reply === 'help' || 'Help')

do tego: if (reply === 'help' || reply === 'Help')

Oświadczenie or nie porównując zmienną.

0

Problemem jest to linia:

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

Ponieważ w JavaScript, obiekty i niepuste ciągi ocenić wartość true, gdy stosowany jako wartość logiczną. Istnieje kilka wyjątków od tego przy użyciu ==

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

W ogóle, to nie jest dobry pomysł, aby użyć == lub surowych zmiennych w instrukcji if.

Jak inni zwrócili uwagę, należy

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

albo lepiej:

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

zamiast.

+0

Niewypełnione ciągi są zgodne z prawdą, a nie prawdziwe - w przeciwnym razie "ciąg" === prawdą "zostanie oceniony jako" prawdziwy ". – nnnnnn

+0

@nnnnnn Masz rację. Myślałem, że większość zastosowań prawdy w JavaScript odnosi się również do "0", ale szybkie google pokazało, że tak nie jest. Zaktualizuję to. –

Powiązane problemy