【问题标题】:Javascript OR operator not working in if statementJavascript OR 运算符在 if 语句中不起作用
【发布时间】:2017-12-04 02:18:56
【问题描述】:

如果星期几与我的声明中列出的任何日期匹配,并且将其限制在 17:00 到 19:00 之间,我正在尝试让这个 Javascript 执行某些操作,但是 OR 运算符没有像我预期的那样工作,我是 JS 新手,我想知道我是否误解了这个运算符的使用。如果我只列出一周中某一天的值,而不是像我的示例中那样列出 3,那么代码将按我希望的那样工作。

var d = new Date();
var dayOfWeek = d.getDay(); // 0 = Sunday
var hour = d.getHours();

if ( dayOfWeek == 4 || 5 || 6 && hour >= 17 && hour < 19 ){
    // do stuff
  } else {
    // do other stuff 
} 

【问题讨论】:

  • 你用错了,会是:if ( dayOfWeek == 4 || dayOfWeek == 5 || dayOfWeek == 6 &amp;&amp; hour &gt;= 17 &amp;&amp; hour &lt; 19 ) {
  • dayOfWeek == 4 || 5 || 6 这在 javascript 中无效,您可能想要:[4,5,6].indexOf(dayOfWeek) &gt; -1 &amp;&amp; hour &gt;= 17 &amp;&amp; hour &lt;19 -> 请注意,这是一种略有不同的方法(使用数组)。
  • 重述每个条件的条件!
  • @briosheje - 是什么让你想到了Array#indexOf? #太棒了
  • dayOfWeek == 4 == 真或假。而 dayOfWeek == 4 || 5 将产生 true 或 5。而 dayOfWeek == 4 || 5 || 6 仍将产生 true 或 5。它不会做你想要的。

标签: javascript if-statement time operators dayofweek


【解决方案1】:

在这种情况下,您最好使用范围检查,因为您只需要与三个或更多的两个比较 - 而且它更易于维护,只需在必要时更改一个值。

if (dayOfWeek >= 4 && dayOfWeek <= 6 && hour >= 17 && hour < 19) {

正确的OR条件需要括号,因为&amp;&amp;precedence超过||

if ((dayOfWeek == 4 || dayOfWeek == 5 || dayOfWeek == 6) && hour >= 17 && hour < 19 ) {

【讨论】:

  • 非常感谢,我没有正确声明我的条件是有道理的!
【解决方案2】:

只是为了发布另一种可能性,如果您有动态输入,您可能需要使用array 并使用indexOf 来检查列表中是否存在这一天:

var d = new Date();
var dayOfWeek = d.getDay(); // 0 = Sunday
var hour = d.getHours();

if ( [4,5,6].indexOf(dayOfWeek) > -1 && hour >= 17 && hour < 19 ){
    // do stuff
  } else {
    // do other stuff 
}

https://jsfiddle.net/hnzzfnot/1/

【讨论】:

    【解决方案3】:

    你需要使用dayOfWeek,但你也可以限制你需要做的检查数量......

    var d = new Date();
    var dayOfWeek = d.getDay(); // 0 = Sunday
    var hour = d.getHours();
    
    if ( (dayOfWeek >= 4 && dayOfWeek <= 6) && (hour>=17 && hour < 19))
    {
      // do stuff
    }
    else
    {
      // doo other stuff
    }
    

    【讨论】:

      【解决方案4】:

      var d = new Date();
      var dayOfWeek = d.getDay(); // 0 = Sunday
      var hour = d.getHours();
      
      if ( (dayOfWeek == 4 || dayOfWeek == 5 || dayOfWeek == 6) && (hour >= 17 && hour < 19) ){
          // do stuff
          console.log("true");
        } else {
          // do other stuff 
          console.log("false");
      }

      【讨论】:

        【解决方案5】:

        你的 if 条件应该是:

        if ( (dayOfWeek == 4 || dayOfWeek == 5 || dayOfWeek == 6) && hour >= 17 && hour < 19 ){
            // do stuff
          } else {
            // do other stuff 
        } 
        

        【讨论】:

        • 感谢您非常正确的回答!有道理我每次都需要重述条件。
        【解决方案6】:

        这样改正,

        var d = new Date();
        var dayOfWeek = d.getDay(); // 0 = Sunday
        var hour = d.getHours();
        
        if ( (dayOfWeek == 4 || 5 || 6) && (hour >= 17 && hour < 19) ){
            console.log("if")
          } else {
            console.log("else")
        }
        

        【讨论】:

        • (dayOfWeek == 4 || 5 || 6) 将无法正常工作,它将始终返回 true(请参阅运算符优先级 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。首先评估==(仅在dayOfWeek = 4 时返回true),如果它返回false,则整个表达式返回5,当评估为布尔值时为真。所以无论dayOfWeek 的值是多少,你总是会从(dayOfWeek == 4 || 5 || 6) 得到true
        • 代码与已发布的问题基本相同,只是少了一些括号。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-28
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        相关资源
        最近更新 更多