если утверждение в JavaScript всегда верно - PullRequest
6 голосов
/ 16 февраля 2012

Итак, у меня есть код, он еще не готов, но все, что я хочу, это отобразить одно окно с предупреждением, если я напишу слово «помощь», и сказать что-то еще, если что-то еще будет введено.

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

но, что бы ни случилось, всплывет первое окно предупреждения, даже если вы нажмете кнопку отмены! Как мне это исправить ???

Ответы [ 5 ]

12 голосов
/ 16 февраля 2012
if (reply === 'help' || 'Help')

должно быть:

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

, поскольку 'Help' является "правдивым", и поэтому первая часть if будет всегда вводиться.

Конечно, еще лучше сделать сравнение без учета регистра:

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

Пример: http://jsfiddle.net/qvEPe/

2 голосов
/ 16 февраля 2012

Проблема здесь:

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

Оператор равенства не "распространяет", попробуйте

if (reply === 'help' || reply === 'Help')
1 голос
/ 16 февраля 2012

Просто измените это: if (reply === 'help' || 'Help')

На это: if (reply === 'help' || reply === 'Help')

Оператор or не сравнивал переменную.

1 голос
/ 16 февраля 2012

Причина, по которой он всегда появляется, состоит в том, что reply === 'help' || 'Help' оценивается как (reply === 'Help') || ('Help').Строковый литерал Help всегда верен в Javascript, следовательно, он всегда оценивается как правдивый.

Чтобы исправить это, вам нужно сравнить reply с обоими значениями

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

Или, если вам нужен какой-либо вариант помощи, используйте регулярное выражение

if (reply.match(/^help$/i)) {
  ...
}
0 голосов
/ 16 февраля 2012

Проблема в этой строке:

 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')

вместо.

...