2012-11-10 141 views
1

我需要经过一年的几个月,看看这个月的最后一天是28,29,30或31。我的问题是,第一,如果语句总是判断为真:为什么我的if语句总是评估为true?

MOIS_I = 31 
if (mois == "Janvier" || "Mars" || "Mai" || "Juillet" || "Août" || "Octobre" || "Décembre" || "1" || "3" || "5" || "7" || "8" || "10" || "12" || "01" || "03" || "05" || "07" || "08") { 
      window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_I + " jours "); 
} 

此外,它似乎有必要做if (mois == "Janver" || mois == "Février" || ...)等,但我想知道是否有更好的方法来做到这一点。

下面是完整的代码:

var mois, annee, test4, test100, test400; 
    const MOIS_P = 30; 
    const MOIS_I = 31; 
    const FEV_NORM = 28; 
    const FEV_BISSEX = 29; 
    const TEST_4 = 4; 
    const TEST_100 = 100; 
    const TEST_400 = 400; 

    mois = window.prompt("Entrez un mois de l'année", ""); 
    annee = window.prompt("Entrez l'année de ce mois", ""); 
    /* MOIS IMPAIRS */ 
    if (mois == "Janvier" || "Mars" || "Mai" || "Juillet" || "Août" || "Octobre" || "Décembre" || "1" || "3" || "5" || "7" || "8" || "10" || "12" || "01" || "03" || "05" || "07" || "08") { 
      window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_I + " jours "); 
    /* MOIS PAIRS */ 
    } else if (mois == "Février" || "Avril" || "Juin" || "Septembre" || "Novembre" || "2" || "4" || "6" || "9" || "11" || "02" || "04" || "06" || "09") { 
     if (mois == "Février") { 
      test4 = parseInt(annee) % TEST_4; 
      test100 = parseInt(annee) % TEST_100; 
      test400 = parseInt(annee) % TEST_400; 
      if (test4 == 0) { 
       if (test100 != 0) { 
        window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_BISSEX + " jours "); 
       } else { 
        window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_NORM + " jours "); 
       } 
      } else if (test400 == 0) { 
        window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_BISSEX + " jours "); 
      } else { 
       window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_NORM + " jours "); 
      } 
     } else { 
      window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_P + " jours "); 
     }   
    } else { 
     window.alert("Apocalypse!"); 
    } 

TEST_4,TEST_100,TEST_400是测试如果年份是闰年(这意味着二月有29天,而不是28)。

谢谢!

+0

什么语言?它*很重要*。看起来它可能是JavaScript,但请注意,'const'在标准JavaScript中还没有出现。 –

+1

请注意,非空字符串总是会计算为** true **,所以'if(/ * any condition || * /“Any string here”)'将始终返回** true **。值** null **,** false **本身,** undefined **和一个空字符串,但是,将评估为** false **。 – inhan

回答

0

根据if声明,是的,您总是需要添加mois ==部分,否则您将检查字符串“Fevrier”的布尔值,而不是将其与mois变量值进行比较。

就您试图实现的一般结果而言,可能有很多更简单的方法,可供您在标准库中使用。如果这是JavaScript,请参阅this article

0

这是我会怎么做呢:

  1. 获取一个月,并将其转换为数字。你可能会想用一个哈希来做到这一点。
  2. 获取年份并将其转换为数字,使用parseInt()就像您所做的那样。
  3. 如果month % 2 == 1,那么它的一个奇怪的一个月:
    • 如果year % 400 == 0 || year % 100 == 0 || year % 4 == 0:妥善处理闰年。
    • 否则:返回30
  4. 否则:它的一个甚至几个月,回到31
+0

有趣。我几天前正在阅读闰年,并且我学到了一些我不知道的东西,所以我想分享它。一个例外是[写在维基百科页面中的“闰年”](http://en.wikipedia.org/wiki/Leap_year)的第二段。 – inhan

2

做这样的(简单的方法)

var last_day=new Date(year,month,-1).getDate() 

这会给最后一个月中的某天

+0

这是我第一次的javascript作业,这看起来是正确的,但我还没有。 – Pobe

-1

下面是一个更好的方法来检查一大堆字符串。你把所有允许名称中的对象(通常称为地图),然后您可以检查该名称是否在地图上用一行代码:

var names = { 
    "Janvier": true, "Mars": true, "Mai": true, "Juillet": true, 
    "Août": true, "Octobre": true, "Décembre": true, 
    "1": true, "3": true, "5": true, "7": true, "8": true, "10": true, "12": true, 
    "01": true, "03": true, "05": true, "07": true, "08": true 
}; 

if (names[mois] === true) { 
    window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_I + " jours "); 
} 
0

这里有一个缩短建议您if()条件:RegExp对象(虽然这不会回答你的问题)。

/^(Janvier|Mars|Mai|Juillet|Août|(Octo|Décem)bre|0?[13578]|1[02])$/.test(mois)) 
// append i after the last forward slash if you want it not to respect case 

if (
mois == "Janvier" || mois == "Mars" || mois == "Mai" || mois == "Juillet" || 
mois == "Août" || mois == "Octobre" || mois == "Décembre" || mois == "1" || 
mois == "3" || mois == "5" || mois == "7" || mois == "8" || mois == "10" || 
mois == "12" || mois == "01" || mois == "03" || mois == "05" || mois == "07" || 
mois == "08" 
) 

相同
if (/^(Février|Avril|Juin|(Sept|Nov)embre|0?[2469]|11)$/.test(mois)) 
// same thing about the case-insensitive (i) flag here... 

if (
mois == "Février" || mois == "Avril" || mois == "Juin" || mois == "Septembre" || 
mois == "Novembre" || mois == "2" || mois == "4" || mois == "6" || mois == "9" || 
mois == "11" || mois == "02" || mois == "04" || mois == "06" || mois == "09" 
) 
0

这似乎不靠谱日期数学的工作是相同的:

var SomeDate = new Date(2012, 10); // November, 2012 

SomeDate.setDate(SomeDate.getDate() - 1); // go back one day 

var DaysInMonth = SomeDate.getDate(); 
相关问题