2012-02-15 66 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