【问题标题】:if statement in javascript always truejavascript 中的 if 语句始终为真
【发布时间】:2012-03-07 08:55:24
【问题描述】:

所以,我有代码,它还没有完成,但我想要它做的只是在我写下“帮助”这个词时显示一个警告框,如果输入了其他任何内容,则说其他内容。

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

但是,无论如何,第一个警告框会弹出,即使您按下取消! 我该如何解决这个问题???

【问题讨论】:

    标签: javascript if-statement prompt


    【解决方案1】:
    if (reply === 'help' || 'Help')
    

    应该是:

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

    因为'Help' 是“真实的”,所以if 的第一部分将始终被输入。

    当然,最好进行不区分大小写的比较:

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

    示例: http://jsfiddle.net/qvEPe/

    【讨论】:

    • 'Help' 在这种情况下并不真实,因为没有== - 请参阅我的答案。但是,'Help' 是真的,因为字符串是 'true',除非周围有 == 运算符。
    • @TimothyJones:我不确定这是否正确。作为非布尔值,'Help' 不能简单地是 true。然而,它在评估时被强制转换为true。换句话说,无论== 是否存在,都会发生类型强制。
    • @AndrewWhitaker 是的,字符串被强制为真,除非它们是空的。但是,Javascript 中的“真实性”仅在存在 == 时才会发生(真实性是由抽象等式比较算法引起的,您可以在 ECMAScript 规范第 5 版 11.9.3 中找到该算法)。所以字符串"0" 也被强制为true,除非周围有==。通常将字符串描述为真实与否是一种误导 - 因为真实性仅发生在 == 比较中。
    • @TimothyJones - 我不同意。 “真实性”是一个比你想象的更笼统的术语。快速示例:var x = 'A' || 'B'; - x 将是 'A',而不是 true,因此即使没有 == 运算符,它也不会被强制为 true。这肯定是“真实性”的一个例子吗? (除非您试图说它被强制转换为 true 同时保留其原始字符串值,这只是变得愚蠢。)此外,即使有 ==0 == "0" 也不会强制转换为 true ...
    • @nnnnnn Javascript 不同意 - if(0 == "0") console.log("true"); 打印为 true :)
    【解决方案2】:

    问题出在这里:

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

    等式运算符不会“分配”,试试

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

    【讨论】:

      【解决方案3】:

      它总是弹出的原因是reply === 'help' || 'Help' 评估为(reply === 'Help') || ('Help')。字符串文字 Help 在 Javascript 中总是真实的,因此它总是评估为真实的。

      要解决此问题,您需要将 reply 与两个值进行比较

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

      或者,如果您想要帮助的任何大小写变体,请使用正则表达式

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

      【讨论】:

        【解决方案4】:

        只要改变这个: if (reply === 'help' || 'Help')

        对此: if (reply === 'help' || reply === 'Help')

        or 语句未比较变量。

        【讨论】:

          【解决方案5】:

          问题出在这一行:

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

          因为在 JavaScript 中,对象和非空字符串在用作布尔值时计算为真。使用==时有几个例外情况@

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

          一般来说,在 if 语句中使用 == 或原始变量并不是一个好主意。

          正如其他人指出的那样,使用

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

          或者更好:

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

          改为。

          【讨论】:

          • 非空字符串是真的,不是真的 - 否则 "string" === true 将评估为 true
          • @nnnnnn 你是对的。我曾认为 Javascript 中的truthy 的大多数用法也指的是“0”,但快速谷歌表明情况并非如此。我会更新的。
          猜你喜欢
          • 2012-09-30
          • 1970-01-01
          • 2021-01-07
          • 2017-02-21
          • 2014-12-19
          • 2021-10-04
          • 1970-01-01
          • 2019-10-05
          • 1970-01-01
          相关资源
          最近更新 更多