【问题标题】:Multiple "if" statements [duplicate]多个“if”语句[重复]
【发布时间】:2015-04-19 14:39:33
【问题描述】:

有没有办法在一个中包含多个 javascript "if" 语句?例如:

if (location.host === "www.google.com", "www.jsfiddle.net") { blah };

或者我只需要使用“||”,例如:

if (location.host === "www.google.com" || location.host === "www.jsfiddle.net"){ blah };

如果有办法做到这一点,或者可能是更简单的方法,请在下面注明。

这个不同,因为其他问题只收到了JS的答案,而这个问题收到了jQuery的回复,也是为了获得不同的目标。

【问题讨论】:

  • "或者我只需要使用"||"" 是的,或者创建一个数组并查看其中是否存在元素。
  • if (location.host in {'www.google.com':1, 'www.jsfiddle.net':1}) { /* blah */ }
  • @JarrodRoberson 这不是那个问题的重复。我会说这是这些问题的子集。看看这个问题和那个问题的答案,主要是为了实现不同的目标。
  • ["www.google.com", "www.jsfiddle.net"].some(Object.is.bind(0, "www.google.com"))

标签: javascript jquery


【解决方案1】:

你可以这样使用javascriptindexOf方法:

var array = ["www.google.com", "www.jsfiddle.net"]
if(array.indexOf(location.host) != -1)
{ //ok
}

【讨论】:

    【解决方案2】:

    另一种选择是使用switch 案例。我个人的做法是,如果我必须执行多个 elseif 语句,我会使用 switch case。 IMO 它更容易阅读,如果您开始处理非常大的查找,它的性能会更高。

    switch(location.host) {
      case 'www.google.com':
        // blah
        break;
      case 'www.jsfiddle.net':
       //blah
       break;
      case 'www.stackoverflow.com':
       // blah
       break;
      default:
       // blah
    }
    

    【讨论】:

      【解决方案3】:

      成语是:

      if(["www.google.com", "www.jsfiddle.net"].indexOf(location.host) > -1) { ... }
      

      但这仅适用于 IE9 及更高版本,以及现代浏览器。

      【讨论】:

        【解决方案4】:

        indexOf 在可读性方面没有多大意义。我更喜欢使用contains 函数来封装“存在检查”。 LodashUnderscore 库有一个,但您也可以轻松创建自己的库:

        function contains(array, element) {
            return array.indexOf(element) > -1;
        }
        
        if (contains(["www.google.com", "www.jsfiddle.net"], location.host)) { blah };
        

        【讨论】:

        • 绝对同意可读性。
        【解决方案5】:

        但是,您可以使用您拥有的语法编写一个函数。

        function assertAnyEquals(value) {
              "use strict";
              var args = new Array(arguments.length);
              for (var i = 1; i < arguments.length; i++) { 
                  args[i] = arguments[i];
              } 
              console.log(args);
        
              return args.some(function(arg) { 
                if (value === arg) { 
                  return true;
                }
              });
            }
        console.log(assertAnyEquals("v", "c"));

        那么使用将是:

        if (assertAnyEquals(location.href, "www.google.com", "www.jsfiddle.net")) { 
            // do stuff 
        }
        

        我更喜欢这样的东西,因为很明显我在做什么函数的名称。

        编辑:更新了这个的实现,因为我意识到即使在找到匹配项之后它也会遍历数组元素。现在没有了。

        【讨论】:

        【解决方案6】:

        我喜欢使用对象查找表,因为它可以保存引号但总是比通过 indexOf 搜索快得多:

        var oks= {"www.google.com":1, "www.jsfiddle.net":1}
        if(oks[location.host]===1){ 
           alert("ok!")
        }
        

        它更快,因为没有方法调用并且属性查找非常快。它甚至比打开大型集合还要快,而且肯定更加灵活和可重复使用。

        每当我需要另一个值中的一个值,没有嵌套条件或其他复杂情况时,我都会选择 LUT。

        此模式还允许您轻松添加新值 (oks[key]=1),使用 extend() 合并集合而不会被欺骗,并在语义上删除不需要的选择 (delete oks['www.google.com']),而不是一堆拼接(indexOf (),1) 病态的。它在旧浏览器中也很有效,不像 [].indexOf()...

        您也可以使用hasOwnProperty.call(oks, key),但它会抵消一些性能优势。

        此外,这实际上只适用于函数、字符串、数字和一些数组,它不允许像 Map() 那样按对象查找。

        我应该提到还有另一种对 IE8 友好的 indexOf 方法: if(",www.google.com,www.jsfiddle.net,".indexOf([,key,])!==1){...}

        【讨论】:

        • 如果您检查的值是字符串"hasOwnProperty""valueOf" 等,您可能应该使用oks.hasOwnProperty(location.host)。此外,这仅适用于字符串和数字。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 2017-10-25
        相关资源
        最近更新 更多