2012-02-15 20 views
5

Así que, tengo el código, no está hecho, pero todo lo que quiero es mostrar un cuadro de alerta si escribo la palabra 'ayuda' y decir algo más si se ingresa algo más .if instrucción en javascript siempre verdadero

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

pero, pase lo que pase, no importa qué, aparece el primer cuadro de alerta, incluso si presiona cancelar! ¿Cómo debo solucionar esto?

+0

Apuesto a que esto le sucede a mucha gente ... gran pregunta, ¡nunca antes la había visto aquí! – Purag

Respuesta

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

debería ser:

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

desde 'Help' es "Truthy" y así será siempre entró en la primera parte de la if.

Por supuesto, aún mejor sería hacer una comparación entre mayúsculas y minúsculas:

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

Ejemplo:http://jsfiddle.net/qvEPe/

+0

'Ayuda' no es verdad en este caso, porque no hay '==' - ver mi respuesta. Sin embargo, 'Ayuda' es verdadero, porque las cadenas son 'verdaderas' a menos que haya un operador '==' alrededor. –

+2

@TimothyJones: No estoy seguro de que sea correcto. Como no booleano, ''Help'' no puede ser simplemente' verdadero'. Sin embargo, se lo coacciona para que sea 'verdadero' en la evaluación. En otras palabras, la coerción de tipo ocurre independientemente de que esté presente un '=='. –

+0

@AndrewWhitaker Sí, las cadenas se fuerzan a la verdad, a menos que estén vacías. Sin embargo, la "veracidad" en Javascript solo ocurre cuando hay un presente '==' (la veracidad es causada por el Algoritmo de Comparación de Igualdad Abstracta, que puede encontrar en la Especificación ECMAScript, 5.a edición 11.9.3). Entonces, la cadena '" 0 "' también se coacciona a verdadero, a menos que haya un '==' alrededor. Es engañoso describir cadenas generalmente como verdaderas o no, ya que la veracidad solo ocurre en comparaciones '=='. –

1

La razón por la que siempre aparece es que reply === 'help' || 'Help' evalúa como (reply === 'Help') || ('Help'). La cadena literal Help es siempre cierta en Javascript, por lo tanto, siempre se evalúa con la verdad.

Para solucionar este problema, necesita comparar reply a ambos valores

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

O si desea cualquier variante caso de uso ayuda una expresión regular

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

El problema está aquí:

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

El operador de igualdad no "distribuye", intente

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

Sólo cambia esto: if (reply === 'help' || 'Help')

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

La declaración or no estaba comparando la variable.

0

El problema es esta línea:

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

Debido a que en JavaScript, los objetos y las cadenas no vacías como resultado true cuando se utiliza como un valor lógico. Hay un par de excepciones a esto cuando se utiliza ==

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

En general, no es una buena idea usar == o primas variables en las sentencias if.

Como otros han señalado, utilice

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

O mejor:

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

lugar.

+0

Las cadenas no vacías son verdaderas, no verdaderas; de lo contrario '" cadena "=== verdadero' se evaluaría como' verdadera'. – nnnnnn

+0

@nnnnnn Tienes razón. Pensé que la mayoría de los usos de truthy en Javascript también se referían a "0", pero un google rápido demostró que ese no es el caso. Lo actualizaré. –

Cuestiones relacionadas