Javascript如果声明有多个允许的条件

可能重复:
Javascript:将一个值与多个值进行比较的最好方法
Javascript如果语句用于检查文件扩展名无效

在JS中,我试图检查扩展名是以“png”“jpg”还是“gif”结尾。 我知道这可以用一个switch语句来完成,但是我想知道是否有一个简单的方法把它全部放在if条件中。 喜欢:

  if (aExtensions[i].toLowerCase() == ('jpg' || 'png' || 'gif')) {} 

什么是达到这个目的的最好方法?

你可以像这样使用一个数组:

 var extensions = ["jpg", "png", "gif"]; if (extensions.indexOf(aExtensions[i].toLowerCase()) > -1) { // match } 

在这种情况下,您将存储“有效的”扩展。 然后,您可以使用ArrayindexOf方法来查找数组中的任何项是否与您正在查看的特定扩展名相匹配 – 检查0或更大的值。

旧版浏览器不支持indexOf ,所以你需要包含一个polyfill来备份它…你可以看一下https://developer.mozilla.org/en-US/docs/JavaScript/Reference / Global_Objects / Array / indexOf#兼容性 ,但有几个解决scheme。

当然,如果你只想使用if语句,你可以使用这种格式:

 var ext = aExtensions[i].toLowerCase(); if (ext == "jpg" || ext == "png" || ext == "gif") { // match } 

我能想到的另一种可能性是switch语句,如:

 var ext = aExtensions[i].toLowerCase(); switch (ext) { case "jpg": case "png": case "gif": // match break; case default: // No match } 

我可能还包括它(其他答案肯定是第一个),但我可以想到的另一个使用正则expression式,如:

 if (/jpg|png|gif/i.test(aExtensions[i])) { // match } 

但请注意,您将永远无法单独获得扩展名,这就是为什么我更喜欢前两个选项之一。

那么正则expression式呢?

 if ( /jpg|png|gif/i.test( aExtensions[i] ) ) { ... } 

另一种方法是使用像这样的对象字面值,

 if ({'jpg':1,'png':1,'gif':1}[aExtensions[i].toLowerCase()]) { // ... } 

通过这种方式,您可以查看匿名对象{'jpg':1,'png':1,'gif':1}是否具有if属性。 1满足这个, undefined不是。


如果你正在使用一个对象,你也可以使用in运算符 (正如Ian所指出的那样),如果对象有一个与它的值无关的键,则这个赋值为真。

 if (aExtensions[i].toLowerCase() in {'jpg':0,'png':1,'gif':2}) { // ... } 

注意这个时候'jpg'仍然通过'jpg':0

你可以使用variables和三重比较,但这是丑陋的。

或者你可以只使用一个数组,并检查是否包含string。

 if (~ ["jpg", "png", "gif"].indexOf(aExtensions[i].toLowerCase()) … 

然而,对于复杂的!= -1比较,以及在较老的IE中缺less本地indexOf ,人们倾向于使用正则expression式:

 if (/jpg|png|gif/i.test(aExtensions[i])) …