【问题标题】:How can I check for an empty/undefined/null string in JavaScript?如何在 JavaScript 中检查空/未定义/空字符串?
【发布时间】:2021-10-05 23:44:22
【问题描述】:

我看到了this question,但没有看到 JavaScript 特定的示例。 JavaScript 中是否有一个简单的string.Empty 可用,还是只是检查"" 的情况?

【问题讨论】:

标签: javascript null is-empty


【解决方案1】:

如果你只是想检查是否有truthy value,你可以这样做:

if (strValue) {
    //do something
}

如果您需要专门检查空字符串是否超过 null,我认为检查 "" 是最好的选择,使用 the === operator(这样您就知道它实际上是一个字符串)比较)。

if (strValue === "") {
    //...
}

【讨论】:

  • 测试长度属性实际上可能比针对 "" 测试字符串更快,因为解释器不必从字符串文字创建 String 对象。
  • @Vincent 在 Chrome 开发人员工具中进行了一些简单的分析,测试 === ''.length 并没有显示出任何明显的改进(并且使用 .length 仅在您可以假设您有字符串)
  • @bdukes 当您开始关心这种微优化时,我不认为 Chrome 是您遇到大部分性能问题的浏览器...
  • 请注意,如果您对“空字符串”的定义包括空格,则此解决方案不合适。一个包含 1 个或多个空格的字符串在上面返回 true。如果您使用的是 JQuery,您可以简单地使用: if ($.trim(ref).length === 0) - 根据类似问题的答案:stackoverflow.com/questions/2031085/…
  • 正如预期的那样,.length > 0 实际上比与字符串文字相比快得多!看看这个jsPerf
【解决方案2】:

为了检查一个变量是否为falsey 或者它的长度属性是否等于零(对于字符串,这意味着它是空的),我使用:

function isEmpty(str) {
    return (!str || str.length === 0 );
}

(请注意,字符串不是唯一具有length 属性的变量,例如,数组也有它们。)

为了检查变量是否为假或字符串是否只包含空格或为空,我使用:

function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}

如果你愿意,你可以像这样monkey-patchString原型:

String.prototype.isEmpty = function() {
    // This doesn't work the same way as the isEmpty function used 
    // in the first example, it will return true for strings containing only whitespace
    return (this.length === 0 || !this.trim());
};
console.log("example".isEmpty());

请注意,猴子修补内置类型是有争议的,因为无论出于何种原因,它都可能破坏依赖于内置类型现有结构的代码。

【讨论】:

  • 为什么 0 === str.length 而不是 str.length === 0 ?
  • @Vincent 条件通常写成这样if (variable == constant value),如果你忘记了一个'=',那么你就是将常量值分配给变量而不是测试。该代码仍然可以工作,因为您可以在 if 中分配变量。所以写这个条件更安全的方法是把常量值和变量取反。这样,当你测试你的代码时,你会看到一个错误(Invalid lef-hand side in assignment)。您还可以使用 JSHint 之类的东西来禁止在条件中赋值,并在编写时收到警告。
  • 很遗憾/^\s*$/.test(str) 不是真正可读的-也许使用更简单的代码或正则表达式删除空格会更好?见stackoverflow.com/questions/6623231/…stackoverflow.com/questions/10800355/…
  • /^\s*$/.test(str) 可以替换为 str.trim().length === 0
  • @Vincent 这也称为“尤达条件”,如if blue is the sky。见dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
【解决方案3】:

前面所有的答案都很好,但这会更好。使用双重 NOT 运算符 (!!):

if (!!str) {
    // Some code here
}

或者使用类型转换:

if (Boolean(str)) {
    // Code here
}

两者的功能相同。将变量类型转换为布尔值,其中str 是一个变量。

  • 它为nullundefined0000""false 返回false

  • 它为空字符串以外的所有字符串值返回true(包括像"0"" "这样的字符串)

【讨论】:

  • if(str)if(!!str)的行为有区别吗?
  • @PeterOlson 如果您尝试将变量保存为检查多个字符串的内容的布尔值,那么您会想要这样做.. 又名var any = (!!str1 && !!str2 && !!str3) 处理如果那里也有数字
  • 这是我一直使用的解决方案。 !!str.trim() 确保字符串不是仅由空格组成的。
  • 看起来不像是 hack,Boolean(str) 可读性更强,“wtfish”更少。
  • 这在if 中根本没用,它将虚假值转换为false,将真实值转换为trueif 块是否执行取决于表达式是否真实,添加 !! 没有意义
【解决方案4】:

你能得到的最接近str.Empty(前提是str是一个字符串)是:

if (!str.length) { ...

【讨论】:

  • str 为 null 会不会抛出异常?
  • @PicMickael 是的! str.Empty也是如此。
  • 请注意,字符串不是唯一具有length 属性的变量类型。数组也可以。
【解决方案5】:

如果您需要确保字符串不只是一堆空格(我假设这是用于表单验证),您需要对空格进行替换。

if(str.replace(/\s/g,"") == ""){
}

【讨论】:

  • 但是如果你真正想要测试的是一个包含非空格内容的字符串,那么它就可以完成这项工作。有没有更便宜的方法来测试这个?
  • 长度属性怎么样?
  • 与其删除所有空格,不如直接检查是否有非空格?有两个优点,如果有非空格字符,它可以提前退出,并且它没有返回一个新的字符串,你可以检查它。 if(str.match(/\S/g)){}
  • @Mark FYI,你不需要全局修饰符,因为第一次出现非空格字符的匹配意味着字符串不为空:str.match(/\S/)
  • 也许/\S/.test(str)str.match(/\S/) 更好,因为它不需要返回一组匹配的结果(可能是那里的微观性能提升)。此外,当仅针对正则表达式测试字符串时,请使用 RegExp .test() 方法更好地传达该意图。
【解决方案6】:

我用:

function empty(e) {
  switch (e) {
    case "":
    case 0:
    case "0":
    case null:
    case false:
    case typeof(e) == "undefined":
      return true;
    default:
      return false;
  }
}

empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
    return ""
})) // false

【讨论】:

  • 此解决方案与语言无关。它唯一依赖的 JavaScript 特性是 typeof。因此,当您不信任不同浏览器中的实现并且没有时间获取更好的解决方案时,这是一个很好的解决方案示例。 (IE,无法访问互联网)。这有点像证明。不是最干净的,但您可以确定它可以在不了解 JavaScript 的情况下工作。
  • 我会走得更远一点,并为未定义的情况使用 === 运算符来确定它。否则,这只是一个完美的答案。
  • typeof 中的 switch 对我不起作用。我添加了一个if (typeof e == "undefined") 测试并且有效。为什么?
  • @Lucas 因为这是一个错字或疏忽。您的修改是正确的方法。 (原文指的是空函数的上下文,不是e参数,这是函数应该检查的)
  • 我们可以用case undefined:代替case typeof(e) == "undefined":吗?
【解决方案7】:

您可以使用lodash: _.isEmpty(值)。

它涵盖了很多情况,如{}''nullundefined等。

但对于Number 类型的JavaScript primitive data types,它总是返回true,例如_.isEmpty(10)_.isEmpty(Number.MAX_VALUE),两者都返回true

【讨论】:

  • _.isEmpty(" "); // => false
  • @Erich 因为" " 不为空。 _.isEmpty(""); 返回 true。
  • 非常正确 - 我提到这一点是因为这里的一些其他答案暗示表单验证和检查字符串是否仅包含空格,而这个单一的 lodash 函数本身并不能解决这个问题。
【解决方案8】:

性能

我在macOS v10.13.6 (High Sierra) 上针对 18 种选定的解决方案进行了测试。解决方案的工作方式略有不同(对于极端情况输入数据),如下面的 sn-p 所示。

结论

  • 基于!str=====length 的简单解决方案适用于所有浏览器(A、B、C、G、I、J)
  • 基于正则表达式 (test,replace) 和 charAt 的解决方案对于所有浏览器 (H,L,M,P) 来说都是最慢的
  • 标记为最快的解决方案仅在一次测试运行中最快 - 但在许多运行中它会在“快速”解决方案组内发生变化

详情

在下面的 sn-p 中,我通过使用不同的输入参数比较了选择的 18 种方法的结果

  • "" "a" " "- 空字符串、带字母的字符串和带空格的字符串
  • []{}f- 数组、对象和函数
  • 0 1 NaN Infinity - 数字
  • true false - 布尔值
  • nullundefined

并非所有经过测试的方法都支持所有输入案例。

function A(str) {
  let r=1;
  if (!str)
    r=0;
  return r;
}

function B(str) {
  let r=1;
  if (str == "")
    r=0;
  return r;
}

function C(str) {
  let r=1;
  if (str === "")
    r=0;
  return r;
}

function D(str) {
  let r=1;
  if(!str || 0 === str.length)
    r=0;
  return r;
}

function E(str) {
  let r=1;
  if(!str || /^\s*$/.test(str))
    r=0;
  return r;
}

function F(str) {
  let r=1;
  if(!Boolean(str))
    r=0;
  return r;
}

function G(str) {
  let r=1;
  if(! ((typeof str != 'undefined') && str) )
    r=0;
  return r;
}

function H(str) {
  let r=1;
  if(!/\S/.test(str))
    r=0;
  return r;
}

function I(str) {
  let r=1;
  if (!str.length)
    r=0;
  return r;
}

function J(str) {
  let r=1;
  if(str.length <= 0)
    r=0;
  return r;
}

function K(str) {
  let r=1;
  if(str.length === 0 || !str.trim())
    r=0;
  return r;
}

function L(str) {
  let r=1;
  if ( str.replace(/\s/g,"") == "")
    r=0;
  return r;
}

function M(str) {
  let r=1;
  if((/^\s*$/).test(str))
    r=0;
  return r;
}


function N(str) {
  let r=1;
  if(!str || !str.trim().length)
    r=0;
  return r;
}

function O(str) {
  let r=1;
  if(!str || !str.trim())
    r=0;
  return r;
}

function P(str) {
  let r=1;
  if(!str.charAt(0))
    r=0;
  return r;
}

function Q(str) {
  let r=1;
  if(!str || (str.trim()==''))
    r=0;
  return r;
}

function R(str) {
  let r=1;
  if (typeof str == 'undefined' ||
      !str ||
      str.length === 0 ||
      str === "" ||
      !/[^\s]/.test(str) ||
      /^\s*$/.test(str) ||
      str.replace(/\s/g,"") === "")

    r=0;
  return r;
}




// --- TEST ---

console.log(                  '   ""  "a"  " " [] {} 0 1 NaN Infinity f true false null undefined ');
let log1 = (s,f)=> console.log(`${s}: ${f("")}   ${f("a")}    ${f(" ")}   ${f([])}  ${f({})}  ${f(0)} ${f(1)} ${f(NaN)}   ${f(Infinity)}        ${f(f)} ${f(true)}    ${f(false)}     ${f(null)}    ${f(undefined)}`);
let log2 = (s,f)=> console.log(`${s}: ${f("")}   ${f("a")}    ${f(" ")}   ${f([])}  ${f({})}  ${f(0)} ${f(1)} ${f(NaN)}   ${f(Infinity)}        ${f(f)} ${f(true)}    ${f(false)}`);
let log3 = (s,f)=> console.log(`${s}: ${f("")}   ${f("a")}    ${f(" ")}`);

log1('A', A);
log1('B', B);
log1('C', C);
log1('D', D);
log1('E', E);
log1('F', F);
log1('G', G);
log1('H', H);

log2('I', I);
log2('J', J);

log3('K', K);
log3('L', L);
log3('M', M);
log3('N', N);
log3('O', O);
log3('P', P);
log3('Q', Q);
log3('R', R);

然后对于所有方法,我对 Chrome v78.0.0、Safari v13.0.4 和 Firefox v71.0.0 的浏览器执行速度测试用例 str = "" - 你可以在你的机器上运行测试 here

【讨论】:

  • 有点误导,因为它结合了修剪解决方案和无修剪解决方案。
  • 干得好,谢谢!!!
【解决方案9】:

非常通用的“一体化”功能(不推荐):

function is_empty(x)
{
    return (                                                           //don't put newline after return
        (typeof x == 'undefined')
              ||
        (x == null)
              ||
        (x == false)        //same as: !x
              ||
        (x.length == 0)
              ||
        (x == 0)            // note this line, you might not need this. 
              ||
        (x == "")
              ||
        (x.replace(/\s/g,"") == "")
              ||
        (!/[^\s]/.test(x))
              ||
        (/^\s*$/.test(x))
    );
}

但是,我不建议使用它,因为您的目标变量应该是特定类型(即字符串、数字或对象?),因此请应用与该变量相关的检查。

【讨论】:

  • 你能解释一下每张支票的作用吗? :)
  • -1 他们正在测试不同的东西。将它们全部放在一个 if 语句中是没有意义的。
  • typeof MyVariable == 'undefined' 不区分具有未定义值的已初始化变量和未声明变量,除非该变量最初已声明并初始化为 null。检查长度属性会导致字符串原语被包装在字符串对象中。
【解决方案10】:
var s; // undefined
var s = ""; // ""
s.length // 0

在 JavaScript 中没有任何东西代表空字符串。检查length(如果您知道var 始终是字符串)或""

【讨论】:

  • 这句话我没看懂:There's nothing representing an empty string in JavaScript. ""呢,那不是代表空字符串吗?
【解决方案11】:

试试:

if (str && str.trim().length) {  
    //...
}

【讨论】:

  • str.trim().length 会比 str.trim() 快,根据我自己的测试结果大约快 1%。
  • OP 正在寻找空字符串、未定义或 null 的测试。这是测试不是任何这些条件的字符串。他也没有说任何关于空白字符串的事情。只要您确定变量中没有存储其他数据类型,您就可以测试 OP 的条件:if (!str) { ... }
【解决方案12】:

我不会太担心最高效的方法。使用对您的意图最清楚的内容。对我来说,这通常是strVar == ""

根据Constantin 的评论,如果 strVar 最终会包含一个整数 0 值,那么这确实是那些意图澄清的情况之一。

【讨论】:

  • 坏主意。如果 strVar 被意外分配为 0,你会得到正确的结果。
  • 我同意明确你的意图比其他方法可能产生的任何微优化更重要,但使用 strict comparison operator === 会更好。仅当strVar 为空字符串时才返回true。
  • 如果未定义,则检查失败。所以 if(str) 效果更好
  • @ValentinHeinitz 如果 str 被分配了一个虚假值 0 或“0”,if(str) 将错误地报告 true。最好的方法是 if(str === "")。这很简单,而且永远不会失败。
【解决方案13】:

你也可以使用正则表达式:

if((/^\s*$/).test(str)) { }

检查是否为空字符串或由空格填充的字符串。

【讨论】:

  • 它可以工作,但在操作方面也非常昂贵。如果您只想检查一两件事,而不是一大堆,那就太好了。
【解决方案14】:

很多答案,还有很多不同的可能性!

毫无疑问,快速简单的实施获胜者是:if (!str.length) {...}

但是,还有许多其他示例可用。我建议最好的功能方法:

function empty(str)
{
    if (typeof str == 'undefined' || !str || str.length === 0 || str === "" || !/[^\s]/.test(str) || /^\s*$/.test(str) || str.replace(/\s/g,"") === "")
        return true;
    else
        return false;
}

有点过分,我知道。

【讨论】:

  • 对未定义的检查需要在检查中移到第一个,否则未定义的项目将在早期检查中引发异常。
  • 完全同意!不错的收获。我将编辑我上面的答案!
  • str.length === 0 对任何没有形式参数的函数返回 true。
  • str.length === 0 || str === "" 两者都会做同样的事情。
【解决方案15】:
  1. 检查var a;是否存在
  2. 去掉值中的false spaces,然后测试emptiness

    if ((a)&&(a.trim()!=''))
    {
      // if variable a is not empty do this 
    }
    

【讨论】:

  • 字符串" "不为空,但在这种情况下会被认为是空的。
【解决方案16】:

此外,如果您认为填充了空格的字符串为“空”。

你可以用这个正则表达式来测试它:

!/\S/.test(string); // Returns true if blank.

【讨论】:

    【解决方案17】:

    我通常使用这样的东西,

    if (!str.length) {
        // Do something
    }
    

    【讨论】:

    • 如果您知道变量是字符串,则最快。如果变量未定义,则引发错误。
    • @AdrianHope-Bailie 为什么要测试未定义的变量?
    • @AbimaelMartell 为什么不呢?您有一个变量,要么是您声明的,要么是从您无法控制的某个范围传递给您的,例如来自方法或 API 调用的响应。您可以假设它包含一个值并使用上面的检查,但如果它未定义或为空,您将收到错误。变种测试=空; if(!test.length){alert("adrian 错了");}
    • OP 询问“如何检查空字符串”,未定义的变量不是空字符串。无论如何,您可以在检查是否为空之前检查typeof variable != "undefined"
    【解决方案18】:

    如果需要检测空字符串和空字符串,我将添加到 Goral 的答案中:

    function isEmpty(s){
        return !s.length;    
    }
    
    function isBlank(s){
        return isEmpty(s.trim());    
    }
    

    【讨论】:

      【解决方案19】:

      开始于:

      return (!value || value == undefined || value == "" || value.length == 0);
      

      看最后一个条件,如果value == "",它的长度必须为0。所以丢弃它:

      return (!value || value == undefined || value == "");
      

      但是等等!在 JavaScript 中,空字符串为假。因此,drop value == "":

      return (!value || value == undefined);
      

      而且 !undefined 为真,因此不需要检查。所以我们有:

      return (!value);
      

      而且我们不需要括号:

      return !value
      

      【讨论】:

      • 如果value = falsevalue = 0 会发生什么。你会根据问题返回正确的答案吗?
      【解决方案20】:

      我使用组合,最快的检查是第一个。

      function isBlank(pString) {
          if (!pString) {
              return true;
          }
          // Checks for a non-white space character
          // which I think [citation needed] is faster
          // than removing all the whitespace and checking
          // against an empty string
          return !/[^\s]+/.test(pString);
      }
      

      【讨论】:

      • 只是想知道您能否解释一下何时需要进行长度检查?不会 !pString 捕获任何空/空字符串吗?这似乎有效。变种测试=''; if (!test) alert('empty');
      • 直到十年后我才看到这条评论。但是,是的,你是对的,我会更新的。 :)
      • 一次 10 年结合我们的知识 :)
      • @Nicholi 2031 年见!
      【解决方案21】:

      我没有注意到考虑到字符串中可能存在空字符的答案。例如,如果我们有一个空字符串:

      var y = "\0"; // an empty string, but has a null character
      (y === "") // false, testing against an empty string does not work
      (y.length === 0) // false
      (y) // true, this is also not expected
      (y.match(/^[\s]*$/)) // false, again not wanted
      

      要测试它的空性,可以这样做:

      String.prototype.isNull = function(){ 
        return Boolean(this.match(/^[\0]*$/)); 
      }
      ...
      "\0".isNull() // true
      

      它适用于空字符串和空字符串,并且所有字符串都可以访问它。此外,它可以扩展为包含其他 JavaScript 空字符或空白字符(即不间断空格、字节顺序标记、行/段落分隔符等)。

      【讨论】:

      • 有趣的分析。我认为这与 99.9% 的情况无关。但我最近发现,如果(且仅当)该列包含空字符(“\0”),MySQL 会将列评估为“空”。另一方面,Oracle 不会将 "\0" 评估为空,而是将其视为长度为 1 的字符串(其中一个字符是空字符)。如果处理不当,这可能会导致混乱,因为许多 Web 开发人员确实使用后端数据库,这可能会传递不同类型的“空”值。它应该在每个开发人员的脑海中。
      【解决方案22】:

      同时,我们可以使用一个函数来检查所有“空”,例如 null、undefined、''、''、{}、[]。 所以我就写了这个。

      var isEmpty = function(data) {
          if(typeof(data) === 'object'){
              if(JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]'){
                  return true;
              }else if(!data){
                  return true;
              }
              return false;
          }else if(typeof(data) === 'string'){
              if(!data.trim()){
                  return true;
              }
              return false;
          }else if(typeof(data) === 'undefined'){
              return true;
          }else{
              return false;
          }
      }
      

      用例和结果。

      console.log(isEmpty()); // true
      console.log(isEmpty(null)); // true
      console.log(isEmpty('')); // true
      console.log(isEmpty('  ')); // true
      console.log(isEmpty(undefined)); // true
      console.log(isEmpty({})); // true
      console.log(isEmpty([])); // true
      console.log(isEmpty(0)); // false
      console.log(isEmpty('Hey')); // false
      

      【讨论】:

        【解决方案23】:

        目前还没有像 string.empty 这样的直接方法来检查字符串是否为空。但是在您的代码中,您可以使用包装器检查空字符串,例如:

        // considering the variable in which your string is saved is named str.
        
        if (str && str.length>0) { 
        
          // Your code here which you want to run if the string is not empty.
        
        }
        

        使用它,您还可以确保字符串也不是未定义的或为空的。请记住,undefined、null 和 empty 是三种不同的东西。

        【讨论】:

        • 它会在 null 或 undefined 上引发错误,因为我们不应该直接对 null 或 undefined 的变量进行操作 - 如其他答案中所述,在执行此操作之前检查 str 是否存在请注意,这适用于 let abc = '' 但不适用于 let abc = ' ',这两者是不同的。
        • 考虑 let rand = ()=&gt;Math.random(),然后 rand &amp;&amp; rand.length &gt; 0) 返回 false,但显然 fn 不是“空”。 IE。对于没有格式参数的任何函数,它都会返回 false。
        • @RobG Math.random() 返回一个数字而不是字符串。这个答案是关于字符串的。 ;-)
        【解决方案24】:

        我在这里没有看到好的答案(至少不是适合我的答案)

        所以我决定自己回答:

        value === undefined || value === null || value === "";

        您需要开始检查它是​​否未定义。否则你的方法可能会爆炸,然后你可以检查它是否等于 null 或等于一个空字符串。

        你不能拥有 !!或者只有if(value),因为如果你检查0,它会给你一个错误的答案(0 是错误的)。

        话虽如此,将其包装在如下方法中:

        public static isEmpty(value: any): boolean { return value === undefined || value === null || value === ""; }

        PS.:你不需要检查typeof,因为它甚至在它进入方法之前就会爆炸并抛出

        【讨论】:

        【解决方案25】:

        所有这些答案都很好。

        但我不能确定变量是字符串,不只包含空格(这对我很重要),并且可以包含“0”(字符串)。

        我的版本:

        function empty(str){
            return !str || !/[^\s]+/.test(str);
        }
        
        empty(null); // true
        empty(0); // true
        empty(7); // false
        empty(""); // true
        empty("0"); // false
        empty("  "); // true
        

        jsfiddle 上的示例。

        【讨论】:

        • 嗯?如果您需要一个字符串,empty(0)empty(7) 应该返回相同的值。
        • 在我的特殊情况下 - empty("0") 必须返回 false(因为那不是空字符串),但 empty(0) 必须返回 true 因为它是空的:)
        • 但是 0 不是为空!它是一个数字,数字不能是满的或空的。当然,这是您的功能,因此必须满足您的要求,但在这种情况下,empty 是一个误导性名称。
        • 我觉得empty这个名字不错。在 empty 函数的 php 文档中:Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE. PHP 和此函数之间的区别 - 字符串 '0' 不会被识别为空。
        • 正如我所说,这是您的功能:您可以随心所欲地调用它。但是empty 是一个不准确且具有误导性的名称。有趣的是,PHP 也有一个名字不好的 empty 函数,但 PHP 的失败与 JavaScript 无关。
        【解决方案26】:

        我对如果将非字符串和非空/空值传递给测试器函数会发生什么进行了一些研究。众所周知,(0 == "") 在 JavaScript 中为真,但由于 0 是一个值,而不是空或 null,您可能需要对其进行测试。

        以下两个函数仅对未定义、null、空/空白值返回 true,对其他所有值(例如数字、布尔值、对象、表达式等)返回 false。

        function IsNullOrEmpty(value)
        {
            return (value == null || value === "");
        }
        function IsNullOrWhiteSpace(value)
        {
            return (value == null || !/\S/.test(value));
        }
        

        存在更复杂的示例,但这些示例很简单并且给出了一致的结果。无需测试未定义,因为它包含在 (value == null) 检查中。您还可以通过将 C# 行为添加到 String 中来模仿,如下所示:

        String.IsNullOrEmpty = function (value) { ... }
        

        你不想把它放在Strings原型中,因为如果String-class的实例为null,就会报错:

        String.prototype.IsNullOrEmpty = function (value) { ... }
        var myvar = null;
        if (1 == 2) { myvar = "OK"; } // Could be set
        myvar.IsNullOrEmpty(); // Throws error
        

        我使用以下值数组进行了测试。如果有疑问,您可以循环测试您的功能。

        // Helper items
        var MyClass = function (b) { this.a = "Hello World!"; this.b = b; };
        MyClass.prototype.hello = function () { if (this.b == null) { alert(this.a); } else { alert(this.b); } };
        var z;
        var arr = [
        // 0: Explanation for printing, 1: actual value
            ['undefined', undefined],
            ['(var) z', z],
            ['null', null],
            ['empty', ''],
            ['space', ' '],
            ['tab', '\t'],
            ['newline', '\n'],
            ['carriage return', '\r'],
            ['"\\r\\n"', '\r\n'],
            ['"\\n\\r"', '\n\r'],
            ['" \\t \\n "', ' \t \n '],
            ['" txt \\t test \\n"', ' txt \t test \n'],
            ['"txt"', "txt"],
            ['"undefined"', 'undefined'],
            ['"null"', 'null'],
            ['"0"', '0'],
            ['"1"', '1'],
            ['"1.5"', '1.5'],
            ['"1,5"', '1,5'], // Valid number in some locales, not in JavaScript
            ['comma', ','],
            ['dot', '.'],
            ['".5"', '.5'],
            ['0', 0],
            ['0.0', 0.0],
            ['1', 1],
            ['1.5', 1.5],
            ['NaN', NaN],
            ['/\S/', /\S/],
            ['true', true],
            ['false', false],
            ['function, returns true', function () { return true; } ],
            ['function, returns false', function () { return false; } ],
            ['function, returns null', function () { return null; } ],
            ['function, returns string', function () { return "test"; } ],
            ['function, returns undefined', function () { } ],
            ['MyClass', MyClass],
            ['new MyClass', new MyClass()],
            ['empty object', {}],
            ['non-empty object', { a: "a", match: "bogus", test: "bogus"}],
            ['object with toString: string', { a: "a", match: "bogus", test: "bogus", toString: function () { return "test"; } }],
            ['object with toString: null', { a: "a", match: "bogus", test: "bogus", toString: function () { return null; } }]
        ];
        

        【讨论】:

        • 如果你只是停止使用 == 而使用 ===,那么 if(s === "") 问题就解决了。
        【解决方案27】:

        检查它是否完全是一个空字符串:

        if(val==="")...
        

        检查它是否为空字符串或无值的逻辑等价物(null、undefined、0、NaN、false、...):

        if(!val)...
        

        【讨论】:

          【解决方案28】:

          使用空合并运算符修剪空白:

          if (!str?.trim()) {
            // do something...
          }
          

          【讨论】:

          • 看起来很酷但是 str.trim() 就足够了。永远不要让 IMO 的事情过于复杂。
          • 只是把它扔给那些可能需要它的人。 ?. 再复杂不过了。如果str 为空,.trim() 会抛出错误。
          【解决方案29】:

          如果只是检查空字符串

          if (str.length){
            //do something
          }
          

          如果您还想在支票中简单地包含 null 和 undefined

          if (Boolean(str)){
            //this will be true when the str is not empty nor null nor undefined
          }
          

          【讨论】:

            【解决方案30】:

            没有isEmpty()方法,你必须检查类型和长度:

            if (typeof test === 'string' && test.length === 0){
              ...
            

            testundefinednull 时,需要进行类型检查以避免运行时错误。

            【讨论】:

            • 我很确定 test === "" 是等价的,而且更短。
            猜你喜欢
            • 2018-11-28
            • 2011-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多