【问题标题】:Is there a standard function to check for null, undefined, or blank variables in JavaScript?是否有标准函数来检查 JavaScript 中的 null、未定义或空白变量?
【发布时间】:2020-06-09 23:15:45
【问题描述】:

是否有一个通用的 JavaScript 函数来检查变量是否有值并确保它不是 undefinednull?我有这段代码,但我不确定它是否涵盖所有情况:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}

【问题讨论】:

  • 专业提示,永远不要这样做(truthy statement) ? true : false;。只需(truthy statement);
  • @GeorgeJempty 不是重复的,因为另一个答案特别询问 strings,而这个询问的是 variables
  • 这个问题的任何正确答案完全取决于你如何定义“空白”。
  • @Jay 就代码的执行而言,它不会伤害任何东西。它只是过于冗长。你不会说,“你饿了是真的吗?”你只是“你饿了吗”所以在代码中只说if (hungry) …而不是if (hungry === true) …。就像所有以这种方式编码的东西一样,这只是一个品味问题。对于 OP 提供的示例更具体,他说得更加冗长,“如果是真的,那就是真的,如果不是,那就是假的”但如果它是真的,那么它已经是真的了。而且,如果它是假的,那它就已经是假的了。这类似于说“如果你饿了,那么你就饿了,如果不饿,那么你就没有。”

标签: javascript null comparison undefined


【解决方案1】:

您可以检查 变量 是否具有truthy 值。这意味着

if( value ) {
}

如果value 不是,则评估为true

  • 未定义
  • NaN
  • 空字符串(“”)
  • 0

上面的列表代表了ECMA-/Javascript 中所有可能的falsy 值。在ToBoolean 部分的specification 中找到它。

此外,如果您不知道变量是否存在(也就是说,如果它被声明),您应该使用typeof 运算符进行检查。比如

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

如果您可以确定至少声明了一个变量,则应直接检查它是否具有如上所示的truthy 值。

【讨论】:

  • 如果该值是预期的假布尔值怎么办。有时你想在没有值的情况下给一个默认值,如果传入 false boolean 则不起作用。
  • @TruMan1:在这种情况下(你的逻辑决定了验证)你必须像if( value || value === false )一样去。所有虚假值也是如此,我们需要明确地验证这些值。
  • 除非 value 是一个数组。 truthy 的解释可能具有误导性。在这种情况下,我们应该检查value.length != 0 是否有一个非空数组。
  • 只想补充一点,如果您觉得if 结构在语法上过于繁重,您可以使用三元运算符,例如:var result = undefined ? "truthy" : "falsy"。或者,如果您只想强制转换为布尔值,请使用 !! 运算符,例如!!1 // true, !!null // false.
  • 另请注意,这不会检查仅包含空格字符的字符串。
【解决方案2】:
function isEmpty(value){
  return (value == null || value.length === 0);
}

这将返回 true

undefined  // Because undefined == null

null

[]

""

和零参数函数,因为函数的length 是它采用的声明参数的数量。

要禁止后一类,您可能只想检查空白字符串

function isEmpty(value){
  return (value == null || value === '');
}

【讨论】:

  • undefined == nullundefined !== null
  • @IanBoyd 那是因为您将 == 与 === 进行比较。这意味着 undefined == null (true) undefined != null (false) undefined === null (false) undefined !== null(true) 最好提供更多信息以便帮助和推动人们在正确的方向。 moz doc 上的区别developer.mozilla.org/en-US/docs/Web/JavaScript/…
【解决方案3】:

检查值是否未定义或为空的详细方法是:

return value === undefined || value === null;

您也可以使用== 运算符,但这需要know all the rules

return value == null; // also returns true if value is undefined

【讨论】:

  • 只检查nullundefined 可以这样完成:if (value == null)。注意强制的== 运算符。如果您像这样检查if (value === null || value === undefined),您忘记/不知道 Javascript 是如何强制执行的。 webreflection.blogspot.nl/2010/10/…
  • @ChristiaanWesterbeek:您认为arg == null 产生与arg === undefined || arg === null 相同的结果。但是,我认为后一个示例更具可读性。
  • arg == null 在我的经验中很常见。
  • return value === (void 0) 比针对 undefined 进行测试更安全,这很可能是范围内的合法变量,遗憾的是。
  • @Sharky 未定义的变量和未声明的变量之间存在差异:lucybain.com/blog/2014/null-undefined-undeclared
【解决方案4】:

你有点过头了。要检查一个变量是否没有赋值,你只需要检查 undefined 和 null。

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

这是假设0"" 和对象(甚至是空对象和数组)都是有效的“值”。

【讨论】:

    【解决方案5】:

    如果尚未声明变量,您将无法使用函数测试未定义,因为您会收到错误消息。

    if (foo) {}
    function (bar) {}(foo)
    

    如果 foo 没有被声明,两者都会产生错误。

    如果你想测试一个变量是否已经被声明,你可以使用

    typeof foo != "undefined"
    

    如果你想测试 foo 是否已经被声明并且它有一个你可以使用的值

    if (typeof foo != "undefined" && foo) {
        //code here
    }
    

    【讨论】:

      【解决方案6】:

      这是最安全的检查,我还没有看到它完全像这样张贴在这里:

      if (typeof value !== 'undefined' && value) {
          //deal with value'
      };
      

      它将涵盖从未定义 value 的情况,以及以下任何情况:

      • 未定义(未定义的值与从未定义的参数不同)
      • 0
      • “”(空字符串)
      • NaN

      已编辑:更改为严格相等 (!==),因为它现在已成为常态;)

      【讨论】:

      • 我没有投反对票,但是关于严格相等比较,一般规则是除非你需要隐式类型转换,否则应该使用严格比较。
      • 感谢史蒂夫的评论。这条一般规则很好。我只是希望人们能够理解他们为什么使用其中一种。你看起来的每一种方式 ppl 都会很高兴向你宣扬“总是使用严格”——就像它是 Javascript 中最重要的东西一样。我见过太多像 if(val !== null) 这样的案例,这显然会导致不想要的结果。有疑问时可以这么说 - 使用 strict,但最好不要有疑问。
      • 我认为这里的重点是我们希望 typeof 运算符返回一个字符串,因此使用严格的相等检查在技术上更准确、更具体和更快。所以真的,没有理由使用松散的比较,而不是相反。 val !== null 在很多情况下也是完全有效的——我一直都这样做。我同意你的不合格论点,但我认为这是一个糟糕的例子。不是想骗你。
      • @guya 这值得为 7 年后的编辑投票!特别是考虑到当天的上述讨论;)荣誉先生!
      • 我认为这是最易读的代码。在所有答案中,这应该是公认的答案。
      【解决方案7】:

      这是我的 - 如果值为 null、未定义等或空白(即仅包含空格),则返回 true:

      function stringIsEmpty(value) {
      
          return value ? value.trim().length == 0 : true;
      
      }
      

      【讨论】:

      • 我在这里对几种方法进行了测试。通过检查未定义,您的函数运行良好。所以我使用 if(typeof value !== 'undefined' && !IsEmpty(value)) 或者,如果你真的想检查空,你可以使用 if(typeof value === 'undefined' || IsEmpty2(value) )。这将适用于 null;不明确的; 0; ""; " ";假
      【解决方案8】:

      第一个评分最高的答案是错误的。如果 value 未定义,它将在现代浏览器中引发异常。你必须使用:

      if (typeof(value) !== "undefined" && value)
      

      if (typeof value  !== "undefined" && value)
      

      【讨论】:

      • eee... 我认为这是错误的,因为 if(value) 就足够了(空对象/数组除外)。如果值为“未定义”,则“如果”条件不会通过。
      • 这会混淆未定义的变量(在评估时会引发 ReferenceError),这些变量与具有 undefined 值的变量不同。
      • 我在这里遇到了同样的错误。如果 x 未定义,if(x), if(!x), if(!!x) 都会抛出错误。
      • if(value === 0) gameOver(); ;)
      • 这个答案也是错误的,因为它在value 为零时返回 false,这 不是 op 正在寻找的。​​span>
      【解决方案9】:

      ! 检查空字符串 ("")、null、undefined、false 以及数字 0 和 NaN。 假设一个字符串为空 var name = "" 然后console.log(!name) 返回true

      function isEmpty(val){
        return !val;
      }
      

      如果 valempty、null、undefined、false、数字 0 或 NaN,此函数将返回 true。

      根据您的问题域,您可以使用 !val!!val

      【讨论】:

      • 这并不能真正说明变量是否为空,因为 false 和 0 可以是有效值而不构成空值。拥有 isEmpty 函数的价值是确保您期望为空的值返回 true。在我看来,null、undefined、NaN 和空字符串是有意义的空值。
      • 如果可以使用!val,为什么还要使用isEmpty(val)
      • 这取决于你。您可以使用它来增加可读性。否则,如果您认为您工作的团队是更高级的编码员,那么您可以根据您的问题域仅使用 !val!!val
      【解决方案10】:

      您可能会发现以下功能很有用:

      function typeOf(obj) {
        return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
      }
      

      或者在 ES7 中(如果有进一步改进请评论)

      function typeOf(obj) {
        const { toString } = Object.prototype;
        const stringified = obj::toString();
        const type = stringified.split(' ')[1].slice(0, -1);
      
        return type.toLowerCase();
      }
      

      结果:

      typeOf(); //undefined
      typeOf(null); //null
      typeOf(NaN); //number
      typeOf(5); //number
      typeOf({}); //object
      typeOf([]); //array
      typeOf(''); //string
      typeOf(function () {}); //function
      typeOf(/a/) //regexp
      typeOf(new Date()) //date
      typeOf(new WeakMap()) //weakmap
      typeOf(new Map()) //map
      

      “请注意,绑定运算符 (::) 不是 ES2016 (ES7) 的一部分,也不是任何更高版本的 ECMAScript 标准。目前它是引入该语言的阶段 0(草头)提案。” ——西蒙·凯尔伯格。作者希望加入他对这一美丽提议的支持,以接受皇室提升。

      【讨论】:

      • +1 知道'regexp'、'array'和'function'类型的对象会很有帮助
      • @Vix,为什么 ES7 版本更好?
      • 它不是,正在尝试使用更易读的方式来表达相同的功能:解构赋值、绑定运算符。
      • 请注意,绑定运算符 (::) 根本不是 ES2016 (ES7) 的一部分,也不是任何更高版本的 ECMAScript 标准。它目前是引入该语言的阶段 0(稻草人)提案。
      【解决方案11】:

      这个条件检查

      if (!!foo) {
          //foo is defined
      }
      

      就是你所需要的。

      【讨论】:

      • 我认为这只是一个 sn-p。但是if 已经做了一个虚假检查,这只是将其转换为布尔值。它能捕捉到普通if(foo) 没有捕捉到的任何情况吗?
      • 这非常适合当您需要内联内容时,例如我需要一个反应属性(称为活动),当字符串不为空时它是正确的 - if 语句将是矫枉过正,所以我可以使用active={!!foo}
      • 除非 foo 为 0
      • 有关更多信息,请在 MDN 上查看 Double NOT (!!)。此外,如果 foo0,则 !!foo 的计算结果为 false
      【解决方案12】:

      如果你喜欢纯 javascript 试试这个:

        /**
         * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
         * length of `0` and objects with no own enumerable properties are considered
         * "empty".
         *
         * @static
         * @memberOf _
         * @category Objects
         * @param {Array|Object|string} value The value to inspect.
         * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
         * @example
         *
         * _.isEmpty([1, 2, 3]);
         * // => false
         *
         * _.isEmpty([]);
         * // => true
         *
         * _.isEmpty({});
         * // => true
         *
         * _.isEmpty('');
         * // => true
         */
      
      function isEmpty(value) {
          if (!value) {
            return true;
          }
          if (isArray(value) || isString(value)) {
            return !value.length;
          }
          for (var key in value) {
            if (hasOwnProperty.call(value, key)) {
              return false;
            }
          }
          return true;
        }
      

      否则,如果您已经在使用下划线或 lodash,请尝试:

      _.isEmpty(value)
      

      【讨论】:

      • 已尝试您的代码。我在控制台中收到一条错误消息:“未捕获的引用错误:isArray() 未定义”。否则,如果它有效,那就太好了。
      • 至少在 lodash 的情况下,_.isNil 是您要查找的函数,而不是 _.isEmptyisNil documentation, isEmpty documentation
      • 如果 value 是 boolean 并且值为 true,这将失败。
      • 纯 javascript 在 window 上没有 isArrayisString 函数。
      • @l3x:这是在开玩笑吗?
      【解决方案13】:

      检查默认值

      function typeOfVar (obj) {
            return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
      }
      function isVariableHaveDefaltVal(variable) {
          if ( typeof(variable) === 'string' ) {  // number, boolean, string, object 
              console.log(' Any data Between single/double Quotes is treated as String ');        
              return (variable.trim().length === 0) ? true : false;
          }else if ( typeof(variable) === 'boolean' ) {
            console.log('boolean value with default value \'false\'');
              return (variable === false) ? true : false;
          }else if ( typeof(variable) === 'undefined' ) {
              console.log('EX: var a; variable is created, but has the default value of undefined.'); 
              return true;
          }else if ( typeof(variable) === 'number' ) { 
              console.log('number : '+variable);
              return (variable === 0 ) ? true : false;
          }else if ( typeof(variable) === 'object' ) {
         //   -----Object-----
              if (typeOfVar(variable) === 'array' && variable.length === 0) {
                  console.log('\t Object Array with length = ' + [].length); // Object.keys(variable)
                  return true;
              }else if (typeOfVar(variable) === 'string' && variable.length === 0 ) {
                  console.log('\t Object String with length = ' + variable.length);
                  return true;
              }else if (typeOfVar(variable) === 'boolean' ) {
                  console.log('\t Object Boolean = ' + variable);
                  return (variable === false) ? true : false;
              }else if (typeOfVar(variable) === 'number' ) {
                  console.log('\t Object Number = ' + variable);
                  return (variable === 0 ) ? true : false;
              }else if (typeOfVar(variable) === 'regexp' && variable.source.trim().length === 0 ) {
             console.log('\t Object Regular Expression : ');
              return true;
              }else if (variable === null) {
             console.log('\t Object null value');
              return true;
              }
          }
          return false;
      }
      var str = "A Basket For Every Occasion";
      str = str.replace(/\s/g, "-");
      //The "g" flag in the regex will cause all spaces to get replaced.
      

      检查结果:

      isVariableHaveDefaltVal(' '); // string          
      isVariableHaveDefaltVal(false); // boolean       
      var a;           
      isVariableHaveDefaltVal(a);               
      isVariableHaveDefaltVal(0); // number             
      isVariableHaveDefaltVal(parseInt('')); // NAN isNAN(' '); - true         
      isVariableHaveDefaltVal(null);              
      isVariableHaveDefaltVal([]);               
      isVariableHaveDefaltVal(/ /);              
      isVariableHaveDefaltVal(new Object(''));               
      isVariableHaveDefaltVal(new Object(false));            
      isVariableHaveDefaltVal(new Object(0)); 
      typeOfVar( function() {} );
      

      我使用@Vix function() 来检查对象的类型。

      使用实例 «

      var prototypes_or_Literals = function (obj) {
          switch (typeof(obj)) {
              // object prototypes
              case 'object':
                  if (obj instanceof Array)
                      return '[object Array]';
                  else if (obj instanceof Date)
                      return '[object Date]';
                  else if (obj instanceof RegExp)
                      return '[object regexp]';
                  else if (obj instanceof String)
                      return '[object String]';
                  else if (obj instanceof Number)
                      return '[object Number]';
      
                  else
                      return 'object';
              // object literals
              default:
                  return typeof(obj);
          }   
      };
      output test «
      prototypes_or_Literals( '' ) // "string"
      prototypes_or_Literals( new String('') ) // "[object String]"
      Object.prototype.toString.call("foo bar") //"[object String]"        
      

      【讨论】:

      • Comparison Operators 检查 == [数据]。 === [数据,对象类型] JS 数字始终存储为双精度浮点数,遵循国际 IEEE 754 标准。 // Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number &amp;&amp; int !== number ) console.log('Data is Equal &amp; Types vary');
      【解决方案14】:

      我认为使用 ?运算符稍微干净一些。

      var ? function_if_exists() : function_if_doesnt_exist();
      

      【讨论】:

        【解决方案15】:

        这将检查不确定嵌套的变量是否未定义

        function Undef(str) 
        {
          var ary = str.split('.');
          var w = window;
          for (i in ary) {
            try      { if (typeof(w = w[ary[i]]) === "undefined") return true; }
            catch(e) { return true; }
          }
          return false;
        }
        
        if (!Undef("google.translate.TranslateElement")) {
        

        以上检查是否存在谷歌翻译函数 TranslateElement。这相当于:

        if (!(typeof google === "undefined" 
         || typeof google.translate === "undefined" 
         || typeof google.translate.TranslateElement === "undefined")) {
        

        【讨论】:

          【解决方案16】:

          对于我的情况,我尝试使用 if null,'', !variable,但它不起作用。

          请参阅下面的代码以从 html 字段中获取文本

          var status=$(this).text(); //for example (for my case)
          

          如果状态变量中没有值(无文本),我试图将值“novalue”设置为状态变量。

          以下代码有效。

          if(status == false)
          {
             status='novalue';
          } 
          

          当没有为 satus 变量找到文本时,上面的代码将“novalue”分配给状态变量

          【讨论】:

          • 真的很想知道为什么这会被否决吗?这真的很有帮助。如果您投反对票,请解释为什么您认为这个答案是错误的。
          • 我认为它并没有真正回答这个问题。您解释了您遇到的问题,但在您回答之前几年,其他人已经为该问题提供了很好的解决方案。
          【解决方案17】:

          虽然是老手,但忘记的是他们应该包装他们的代码块,然后捕获错误然后测试......

          function checkup( t ){
            try{
              for(p in t){
                if( p.hasOwnProperty( t ) ){
                  return true;
                }
              }
              return false;
            }catch(e){
              console.log("ERROR : "+e);
              return e;
            }
          }
          

          因此,您实际上不必事先检查潜在问题,您只需抓住它,然后按照自己的意愿处理。

          【讨论】:

            【解决方案18】:
            function isEmpty(val){
                return !val;
            }
            

            但是这个解决方案是过度设计的,如果您不想稍后修改该功能以满足业务模型的需要,那么直接在代码中使用它会更干净:

            if(!val)...
            

            【讨论】:

              【解决方案19】:
              var myNewValue = myObject && myObject.child && myObject.child.myValue;
              

              这永远不会引发错误。如果 myObjectchildmyValue 为 null,则 myNewValue 将为 null。不会抛出任何错误

              【讨论】:

                【解决方案20】:

                对于遇到类似问题的每个人来说,以下内容非常有用,我在过去几年的图书馆中有它:

                (function(g3, $, window, document, undefined){
                   g3.utils = g3.utils || {};
                /********************************Function type()********************************
                * Returns a lowercase string representation of an object's constructor.
                * @module {g3.utils}
                * @function {g3.utils.type}
                * @public
                * @param {Type} 'obj' is any type native, host or custom.
                * @return {String} Returns a lowercase string representing the object's 
                * constructor which is different from word 'object' if they are not custom.
                * @reference http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
                * http://stackoverflow.com/questions/3215046/differentiating-between-arrays-and-hashes-in-javascript
                * http://javascript.info/tutorial/type-detection
                *******************************************************************************/
                g3.utils.type = function (obj){
                   if(obj === null)
                      return 'null';
                   else if(typeof obj === 'undefined')
                      return 'undefined';
                   return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
                };
                }(window.g3 = window.g3 || {}, jQuery, window, document));
                

                【讨论】:

                  【解决方案21】:

                  可能有用。

                  数组中的所有值都代表您想要成为的内容(null、未定义或其他内容),您可以在其中搜索您想要的内容。

                  var variablesWhatILookFor = [null, undefined, ''];
                  variablesWhatILookFor.indexOf(document.DocumentNumberLabel) > -1
                  

                  【讨论】:

                  • 请您解释一下。那里发生了什么
                  • 该数组包含一些您假定为空的变量。
                  • @JoshKisb 数组中的所有值都代表您想要成为的内容(null、未定义或其他内容),您可以在其中搜索您想要的内容。
                  • @ddagsan 虽然 JoshKisb 可能会感谢您的回复,但您应该将您的解释放在您的回答中,而不是在 cmets 中
                  【解决方案22】:

                  此函数检查empty object {}empty array []nullundefinedblank string ""

                  function isEmpty(val) {
                    //check for empty object {}, array []
                    if (val !== null && typeof val === 'object') {
                      if (Object.keys(obj).length === 0) {
                        return true;
                      }
                    }
                    //check for undefined, null and "" 
                    else if (val == null || val === "") {
                      return true;
                    }
                    return false;
                  }
                  

                  var val={};
                  isEmpty(val) -> 真
                  val=[];
                  isEmpty(val) -> 真
                  isEmpty(未定义) -> true
                  isEmpty(null) -> 真
                  isEmpty("") -> 真
                  isEmpty(false) -> 假
                  isEmpty(0) -> 假

                  【讨论】:

                    【解决方案23】:

                    你可以直接使用相等运算符

                    <script>
                        var firstName;
                        var lastName = null;
                        /* Since null == undefined is true, the following statements will catch both null and undefined */
                            if(firstName == null){
                                alert('Variable "firstName" is undefined.');
                            }    
                            if(lastName == null){
                               alert('Variable "lastName" is null.');
                            }
                    </script>
                    

                    演示@How to determine if variable is undefined or null using JavaScript

                    【讨论】:

                      【解决方案24】:

                      尝试不同的逻辑。您可以使用波纹管代码检查所有四 (4) 个条件以进行验证,例如非空、非空白、非未定义和非零仅在 javascript 和 jquery 中使用此代码 (!(!(variable)))。

                      function myFunction() {
                          var data;  //The Values can be like as null, blank, undefined, zero you can test
                      
                          if(!(!(data)))
                          {
                              alert("data "+data);
                          } 
                          else 
                          {
                              alert("data is "+data);
                          }
                      }
                      

                      【讨论】:

                        【解决方案25】:
                        function isEmpty(obj) {
                            if (typeof obj == 'number') return false;
                            else if (typeof obj == 'string') return obj.length == 0;
                            else if (Array.isArray(obj)) return obj.length == 0;
                            else if (typeof obj == 'object') return obj == null || Object.keys(obj).length == 0;
                            else if (typeof obj == 'boolean') return false;
                            else return !obj;
                        }
                        

                        在 ES6 中使用 trim 处理空白字符串:

                        const isEmpty = value => {
                            if (typeof value === 'number') return false
                            else if (typeof value === 'string') return value.trim().length === 0
                            else if (Array.isArray(value)) return value.length === 0
                            else if (typeof value === 'object') return value == null || Object.keys(value).length === 0
                            else if (typeof value === 'boolean') return false
                            else return !value
                        }
                        

                        【讨论】:

                        • 很棒的功能,谢谢!处理所有类型的值 - 在所有其他解决方案中都忽略了数字!
                        • @FabianvonEllerts 请不要尝试将其他代码编辑到其他人的答案中。将其作为您自己的答案发布,作为答案下方的评论,或在评论中请求他们自己更新答案。
                        【解决方案26】:

                        如果您使用 TypeScript 并且不想考虑 false 的值”,那么这是适合您的解决方案: p>

                        第一:import { isNullOrUndefined } from 'util';

                        然后:isNullOrUndefined(this.yourVariableName)

                        请注意:如上所述 below 现在已弃用,请改用 value === undefined || value === nullref.

                        【讨论】:

                        • 我认为这很酷,所以我最初没有投票,但它是一个已被弃用的 Node.js 东西。类型定义文件说:/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
                        • @atomictom 我认为这是typescript 的事情。您能否提供其文档的链接?
                        • 这里:nodejs.org/api/util.html#util_util_isnullorundefined_object。另外:“我认为这很酷,所以我最初赞成”应该是:)
                        • 为什么要弃用这样一个有用的简单的东西?哎呀。
                        【解决方案27】:
                        try{
                        
                             let vari = obj.propTest; // obj may be don't have propTest property
                        
                                ...
                        } catch(NullException){
                            // do something here
                        }
                        

                        我认为使用 try catch 可以避免 null 检查的任何错误,在 Angular 或 JavaScript 中也是如此 只是捕获空异常并在其中处理。

                        【讨论】:

                        • 包含对您的代码的作用以及它回答问题的原因的解释可能会更有帮助。仅发布代码有时可能不清楚。
                        • 你应该添加一个解释来证明你的答案。
                        • 我尝试在 Angular 中使用这个问题的一些解决方案进行编码,但我发现在这种情况下 try catch 是安全的处理方式:D
                        【解决方案28】:
                        return val || 'Handle empty variable'
                        

                        在很多地方都是一种非常干净整洁的处理方式,也可以用于分配变量

                        const res = val || 'default value'
                        

                        【讨论】:

                        • 很多地方,但不是在默认为 true 并且您尝试提供或返回 valfalse 时。
                        • @Molomby 这是一个非常特殊的边缘情况,但即使这样也很容易处理const res = falsyValue ? true : falsyValue
                        【解决方案29】:

                        我非常喜欢的解决方案:

                        让我们定义一个空白变量是null,或者undefined,或者如果它有长度,它是零,或者如果它是一个对象,它没有键:

                        function isEmpty (value) {
                          return (
                            // null or undefined
                            (value == null) ||
                        
                            // has length and it's zero
                            (value.hasOwnProperty('length') && value.length === 0) ||
                        
                            // is an Object and has no keys
                            (value.constructor === Object && Object.keys(value).length === 0)
                          )
                        }
                        

                        返回:

                        • 真: undefinednull""[]{}
                        • false: true, false, 1, 0, -1, "foo", [1, 2, 3], { foo: 1 }

                        【讨论】:

                          【解决方案30】:

                          空虚

                          我不建议尝试定义或使用计算整个世界中的任何值是否为空的函数。 “空”的真正含义是什么?如果我有let human = { name: 'bob', stomach: 'empty' },是否应该isEmpty(human) 返回true?如果我有let reg = new RegExp('');,是否应该isEmpty(reg) 返回trueisEmpty([ null, null, null, null ]) 怎么样 - 这个列表只包含空,所以列表本身是空的吗?我想在这里提出一些关于 javascript 中“空洞”(一个故意模糊不清的词,以避免预先存在的关联)的注释 - 我想争辩说 javascript 值中的“空洞”永远不应该被笼统地处理。


                          真/假

                          为了决定如何确定值的“空性”,我们需要适应 javascript 内置的、固有的关于值是“真”还是“假”的感觉。当然,nullundefined 都是“虚假的”。不太自然的是,数字0(除了NaN 之外没有其他数字)也是“假的”。最不自然:'' 是虚假的,但 []{}(以及 new Set()new Map())是真实的 - 尽管它们看起来都同样空洞!


                          空与未定义

                          还有一些关于nullundefined 的讨论——我们真的需要两者来表达我们的程序的空洞性吗?我个人避免让字母 u、n、d、e、f、i、n、e、d 以这种顺序出现在我的代码中。我总是用null 来表示“空虚”。不过,我们需要再次适应 javascript 对 nullundefined 不同之处的固有认识:

                          • 尝试访问不存在的属性会得到undefined
                          • 调用函数时省略参数会导致该参数接收undefined

                          let f = a => a;
                          console.log(f('hi'));
                          console.log(f());
                          • 只有在给定undefined而不是null时,具有默认值的参数才会接收默认值:

                          let f = (v='hello') => v;
                          console.log(f(null));
                          console.log(f(undefined));

                          对我来说,null 是一个明确的空洞符号; “本来可以填写的东西故意留空”。

                          真的undefined 是一个必要的复杂性,它允许一些 js 功能存在,但在我看来 它应该始终留在幕后;没有直接互动。例如,我们可以将undefined 视为 javascript 实现默认函数参数的机制。如果您不向函数提供参数,它将收到 undefined 的值。如果该参数最初设置为undefined,则默认值将应用于函数参数。在这种情况下,undefined 是默认函数参数的关键,但它保留在后台:我们可以实现默认参数功能,而无需参考 undefined

                          这是默认参数的错误实现,因为它直接与 undefined 交互:

                          let fnWithDefaults = arg => {
                            if (arg === undefined) arg = 'default';
                            ...
                          };
                          

                          这是一个很好的实现:

                          let fnWithDefaults = (arg='default') => { ... };
                          

                          这是接受默认参数的不好方法:

                          fnWithDefaults(undefined);
                          

                          只需这样做:

                          fnWithDefaults();
                          

                          非泛型空虚

                          我认为永远不应该以通用的方式处理空虚。相反,我们应该始终严格地在确定数据是否为空之前获取有关我们数据的更多信息 - 我主要通过检查我正在处理的数据类型来做到这一点:

                          let isType = (value, Cls) => {
                            // Intentional use of loose comparison operator detects `null`
                            // and `undefined`, and nothing else!
                            return value != null && Object.getPrototypeOf(value).constructor === Cls;
                          };

                          请注意,此函数忽略继承 - 它期望 valueCls 的直接实例,而不是 Cls 的子类的实例。我避免instanceof 有两个主要原因:

                          • ([] instanceof Object) === true(“数组就是对象”)
                          • ('' instanceof String) === false(“字符串不是字符串”)

                          请注意,Object.getPrototypeOf 用于避免 let v = { constructor: String }; 之类的情况。isType 函数仍可正确返回 isType(v, String) (false) 和 isType(v, Object) (true)。

                          总的来说,我建议使用此isType 函数以及以下提示:

                          • 尽量减少未知类型的代码处理值。例如,对于let v = JSON.parse(someRawValue);,我们的v 变量现在是未知类型。我们应该尽早限制我们的可能性。最好的方法是要求特定类型:例如if (!isType(v, Array)) throw new Error('Expected Array'); - 这是删除v 的通用性并确保它始终是Array 的一种非常快速且富有表现力的方式。不过,有时我们需要允许v 具有多种类型。在这些情况下,我们应该尽早创建 v 不再是通用的代码块:

                          if (isType(v, String)) {
                            /* v isn't generic in this block - It's a String! */
                          } else if (isType(v, Number)) {
                            /* v isn't generic in this block - It's a Number! */
                          } else if (isType(v, Array)) {
                            /* v isn't generic in this block - it's an Array! */
                          } else {
                            throw new Error('Expected String, Number, or Array');
                          }
                          • 始终使用“白名单”进行验证。如果您需要一个值,例如字符串、数字或数组,请检查这 3 种“白色”可能性,如果都不存在则抛出错误3 满意。我们应该能够看到检查“黑色”的可能性并不是很有用:假设我们写 if (v === null) throw new Error('Null value rejected'); - 这对于确保 null 值不会通过它非常有用,但是如果一个值 确实 通过了,我们仍然对此一无所知。通过此 null 检查的值 v 仍然非常通用 - 除了null 之外的任何东西!黑名单很难消除普遍性。
                          • 除非值是null,否则永远不要考虑“空值”。相反,请考虑“一个空的 X”。 本质上,永远不要考虑做类似 if (isEmpty(val)) { /* ... */ } 之类的事情 - 无论 isEmpty 函数是如何实现的(我不想知道......),它没有意义!而且太笼统了!真空度只能在知道val 的类型的情况下计算。真空度检查应如下所示:
                            • “一个字符串,没有字符”: if (isType(val, String) &amp;&amp; val.length === 0) ...

                            • “一个对象,有 0 个道具”:if (isType(val, Object) &amp;&amp; Object.entries(val).length === 0) ...

                            • “一个数字,等于或小于零”:if (isType(val, Number) &amp;&amp; val &lt;= 0) ...

                            • “一个数组,没有项目”:if (isType(val, Array) &amp;&amp; val.length === 0) ...

                            • 唯一的例外是null 用于表示某些功能。在这种情况下,说“空值”是有意义的:if (val === null) ...

                          【讨论】:

                          • 我可以看到你已经考虑了这个:>
                          • 这是一个绝妙的答案,值得更多的爱!
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-02-03
                          • 2012-08-29
                          • 1970-01-01
                          • 2018-09-09
                          • 1970-01-01
                          相关资源
                          最近更新 更多