【问题标题】:Javascript isnullJavascript isnull
【发布时间】:2010-12-26 13:59:53
【问题描述】:

这是一个用 jQuery 编写的用于确定 url 字段值的非常棒的函数:

$.urlParam = function(name){
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
    return results[1] || 0;
}

// example.com?someparam=name&otherparam=8&id=6
$.urlParam('someparam'); // name
$.urlParam('id'); // 6
$.urlParam('notavar'); // null

http://snipplr.com/view/11583/retrieve-url-params-with-jquery/

我想添加一个条件来测试 null,但这看起来有点笨拙:

if (results == null) {
    return 0;
} else {
    return results[1] || 0;
}

问:完成上述 if/then 语句的优雅方法是什么?

【问题讨论】:

  • 大声笑,我正要问确切问题的确切代码。 3年后
  • results[1] 的测试是不必要的,因为如果results 不为空,则表示正则表达式成功,这意味着也找到了第一个捕获的组。所以你只需要results ? results[1] : 0

标签: javascript jquery url


【解决方案1】:
return results == null ? 0 : (results[1] || 0);

【讨论】:

  • @Brad 什么是(结果 [1] || 0)?我以前没见过。
  • 它是 'results' 中索引位置 1 的对象或值 0。
  • 布拉德,尝试使用.test() 最好
【解决方案2】:
return results == null ? 0 : ( results[1] || 0 );

【讨论】:

  • @DDaviesBrackett:它没有:js> results = null;空 js> 结果[1] || 0; typein:2: TypeError: results has no properties
  • 好吧,看来你先回答了,所以你得到了我的支持。
  • 再想一想,我不确定与 null 的比较是否是最易读的方法,我想我更喜欢 return results instanceof Array 之类的东西? (结果[1] || 0):0
【解决方案3】:

最简洁的解决方案是将return results[1] || 0; 更改为return (results && results[1]) || 0

【讨论】:

  • 如果我返回结果 [1] || 在 firebug 中出现错误“结果为空” 0
  • 不需要括号,这是默认优先级,所以results && results[1] || 0
  • 对 Phillip 来说为时已晚,但我会咬一口:&& 是短路“和”运算符developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案4】:

你可以试试这个:

if(typeof(results) == "undefined") { 
    return 0;
} else {
    return results[1] || 0;
}

【讨论】:

    【解决方案5】:
    return results==null ? 0 : ( results[1] || 0 );
    

    【讨论】:

    • 您刚刚重写了 OP 提供的代码以使用三元运算符而不是 if
    【解决方案6】:
    return (results||0) && results[1] || 0;
    

    && 操作符充当守卫,如果结果为假则返回 0,如果为真则返回最右边的部分。

    【讨论】:

      【解决方案7】:
      if (typeof(results)!='undefined'){ 
          return results[1];
      } else { 
          return 0; 
      };
      

      但您可能想检查 results 是否为数组。数组是 Object 类型的,所以你需要这个 function

      function typeOf(value) {
          var s = typeof value;
          if (s === 'object') {
              if (value) {
                  if (value instanceof Array) {
                      s = 'array';
                  }
              } else {
                  s = 'null';
              }
          }
          return s;
      }
      

      所以你的代码变成了

      if (typeOf(results)==='array'){
            return results[1];
      }
      else
      {
            return 0;
      }
      

      【讨论】:

        【解决方案8】:

        所有提到的解决方案都是合法的,但如果我们谈论的是优雅,那么我将使用以下示例:

        //function that checks if an object is null
        var isNull = function(obj) {
          return obj == null;
        }            
        
        if(isNull(results)){
         return 0;
        } else {
          return results[1] || 0;
        }
        

        使用 isNull 函数有助于代码更具可读性。

        【讨论】:

          【解决方案9】:

          我更喜欢这种风格

          (results || [, 0]) [1]
          

          【讨论】:

          • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
          • 它确实为这个问题提供了明确的答案。这不是批评或澄清要求。在什么意义上它不是一个答案?这是我一直用来处理 OP 提出的精确问题的结构,即如何简洁地处理来自RegExp#execnull 结果。
          • 我最喜欢这个答案,因为我找不到误解它的方法,而且重要的是,默认答案 (0) 仅指定一次。当一个特定的幻数出现在多个地方时,会引入许多编码错误。
          【解决方案10】:

          为什么不试试.test() 呢? ...尝试它的最佳布尔值(真或假):

          $.urlParam = function(name){
              var results = new RegExp('[\\?&]' + name + '=([^&#]*)');
              return results.test(window.location.href);
          }
          

          教程: http://www.w3schools.com/jsref/jsref_regexp_test.asp

          【讨论】:

            【解决方案11】:

            我正在使用这个功能

            function isNull() {
                for (var i = 0; i < arguments.length; i++) {
                    if (
                        typeof arguments[i] !== 'undefined'
                        && arguments[i] !== undefined
                        && arguments[i] != null
                        && arguments[i] != NaN
                        && arguments[i] 
                    ) return arguments[i];
                  }
            }
            

            测试

            console.log(isNull(null, null, undefined, 'Target'));
            

            【讨论】:

              【解决方案12】:

              您也可以使用 not 运算符。它将检查变量是否为空,或者在字符串的情况下是否为空。它使您的代码更紧凑,更易于阅读。

              例如:

              var pass = "";
              if(!pass)
                  return false;
              else
                  return true;
              

              这将返回 false,因为字符串为空。如果变量 pass 为空,它也会返回 false。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-06-03
                • 2018-10-30
                • 2010-10-16
                • 1970-01-01
                相关资源
                最近更新 更多