如何在JavaScript中检查empty/undefined/null字符串?

cas*_*ora 2645 javascript null is-empty

我看到了这个帖子,但我没有看到JavaScript特定的例子.有一个简单string.Empty的JavaScript可用,还是只是检查的情况""

bdu*_*kes 3323

如果您只想检查是否有任何价值,您可以这样做

if (strValue) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

如果您需要专门为在空空字符串检查,我想核对""是你最好的选择,使用===运营商(让你知道这是,事实上,一个字符串你对比较).

if (strValue === "") {
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • 测试length属性实际上可能比测试字符串""更快,因为解释器不必从字符串文字创建String对象. (149认同)
  • 正如预期的那样`.length> 0`实际上**比字符串文字要快得多**!看看这个[jsPerf](http://jsperf.com/vs-length-0) (102认同)
  • @bdukes当你开始关心那种微优化时,我不认为Chrome是你遇到大部分性能问题的浏览器...... (23认同)
  • @Vincent在Chrome开发人员工具中做了一些天真的分析,测试`===''`vs`.length`并没有显示出任何明显的改进(并且使用`.length`只有在你可以假设你有一个字符串时才有效) (17认同)
  • 需要注意的是,如果您对"空字符串"的定义包含空格,则此解决方案不合适.一个包含1个或多个空格的字符串返回true.如果你正在使用JQuery,你可以简单地使用它:if($ .trim(ref).length === 0) - 根据类似问题的答案:http://stackoverflow.com/questions/2031085/how-可以,我检查,如果字符串 - 包含的字符空白 - 不只是空白/ 6610847#6610847 (13认同)
  • @Chad,您的 jsPerf 有很大缺陷,因为其中一个测试比较特定值,而另一个测试比较除空以外的任何值。所以为了公平起见,第一个测试应该是 `s!==""`,它比 `s.length > 0` 慢 24% (4认同)
  • 在关注性能差异之前,请考虑它将运行多少次。例如,每个站点运行一次“if”语句,您的性能优化接近于零。如果你的代码比原始代码长,那么你在网络上损失的时间可能比在 JavaScript 执行上赢得的时间更多。最后,当您使用任何构建工具时,这些微优化都会丢失。所以我的建议是“编写更具可读性的代码” (3认同)
  • str=0; if(str) 返回 false (2认同)

小智 1060

为了检查字符串是否为空,null或未定义,我使用:

function isEmpty(str) {
    return (!str || 0 === str.length);
}
Run Code Online (Sandbox Code Playgroud)

为了检查字符串是否为空,null或未定义,我使用:

function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}
Run Code Online (Sandbox Code Playgroud)

用于检查字符串是空白还是仅包含空格:

String.prototype.isEmpty = function() {
    return (this.length === 0 || !this.trim());
};
Run Code Online (Sandbox Code Playgroud)

  • @Vincent条件通常写成`if(variable == constant value)`,如果忘记'=',那么你将常量值赋给变量而不是测试.代码仍然有效,因为您可以在if中分配变量.因此,编写此条件的更安全方法是反转常量值和变量.这样,当您测试代码时,您将看到错误(分配中的无效左侧).你也可以使用像JSHint这样的东西来禁止在条件中进行赋值,并在你编写条件时发出警告. (46认同)
  • 为什么0 === str.length而不是str.length === 0? (13认同)
  • @Vincent这也被称为"尤达条件",就像`如果蓝色是天空`.见http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html (13认同)
  • /^\s*$/.test(str)可以替换为str.trim().length === 0 (5认同)
  • 不过,扩展原生原型并不是一个好主意,它通常被认为是一种不好的做法,很多人只是建议完全不要这样做,因为有更安全的方法也同样好。[这里](/sf/ask/982392631/)有一个关于这个主题的讨论,但是我读过的每一本 JS 编程书籍强烈建议反对。对于 OP 问题,我通常只执行 `if (!str) { // 我确信 str 是空 null 或未定义,如果我确定它不会是另一种数据类型 }` (3认同)
  • 遗憾的是`/ ^\s*$/.test(str)`不是真的可读 - 可能使用更简单的代码或正则表达式删除空格会更好吗?请参阅http://stackoverflow.com/questions/6623231/remove-all-white-spaces-from-text以及http://stackoverflow.com/questions/10800355/remove-whitespaces-inside-a-string-in- JavaScript的 (2认同)
  • `return (this.length === 0 || !this.trim())` 比`return !this.trim()` 有什么好处? (2认同)
  • 空字符串是假的,所以条件的第二部分并不是真正需要的:`(! str || str.length == 0)` (2认同)

小智 275

以上所有都很好,但这会更好.使用!!(而不是)运营商.

if(!!str){
some code here;
}
Run Code Online (Sandbox Code Playgroud)

或使用类型转换:

if(Boolean(str)){
    codes here;
}
Run Code Online (Sandbox Code Playgroud)

两者都执行相同的功能,将变量类型转换为boolean,其中str是变量.
返回falsenull,undefined,0,000,"",false.
返回true字符串"0"和空格"".

  • 为什么这"更好"? (50认同)
  • `if(str)`和`if(!! str)`的行为有什么区别吗? (26认同)
  • 这是我一直使用的解决方案.`!! str.trim()`以确保字符串不仅仅由空格组成. (21认同)
  • @PeterOlson如果你试图将变量保存为检查多个字符串内容的布尔值那么你会想要这样做..又名`var any =(!! str1 && !! str2 && !! str3)`处理如果有的话也是一个数字 (5认同)
  • 这在“if”中毫无用处,它将假值转换为“假”,将真值转换为“真”。`if` 块是否执行取决于表达式是否为真,添加 `!!` 是没有意义的。 (5认同)
  • 看起来不像黑客,`布尔(str)`更具可读性,更少"重要". (3认同)
  • 请注意,`!!`不是运算符.它是一个应用两次的运算符. (3认同)
  • 这不是一个很好的技巧,而是应该这样做的方式。这是正确的方法。Javascript 将 "" 和 null 的真值定义为假。 (2认同)
  • @xehpuk 不确定我是否遵循您的意思。*not not* 运算符强制执行布尔类型.. 又名 true 或 false。如果要强制使用布尔类型,请使用 not not 运算符。本质上,if 检查中两者之间没有区别。但是当您想要一个在多个地方使用的布尔标志时,它特别有用。这就是我的评论所指的内容,尽管没有明确说明。 (2认同)
  • !!砰砰,你是布尔人!! (2认同)

Sug*_*ran 98

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

if(str.replace(/\s/g,"") == ""){
}
Run Code Online (Sandbox Code Playgroud)

  • @Mark FYI,你不需要全局修饰符,因为第一次出现非空格字符的匹配意味着字符串不为空:`str.match(/\S /)` (31认同)
  • 而不是删除所有空格,为什么不检查是否有非空格?如果存在非空格字符,它有两个优点,它可以提前纾困,并且它没有返回一个新的字符串,然后您检查.`如果(str.match(/\S /克)){}` (24认同)
  • 但是,如果您真正想要测试的是具有非空间内容的字符串,那么这项工作是否正确.有没有更便宜的方法来测试这个? (8认同)
  • 为什么不直接使用 `if(str.trim()) {...}` ? (5认同)
  • 长度属性怎么样? (3认同)
  • 重要提示:如果`str`为`null`,则会抛出错误. (2认同)
  • 也许 `/\S/.test(str)` 比 `str.match(/\S/)` 更好,因为它不会返回匹配结果的数组(可能是微性能增益)。此外,当仅针对正则表达式*测试* 字符串时,请使用正则表达式`.test()` 方法来更好地传达该意图。 (2认同)

Ate*_*ral 95

你能得到的最接近的东西str.Empty(前提是str是一个String)是:

if (!str.length) { ...
Run Code Online (Sandbox Code Playgroud)

  • 那不是抛出异常是str为null吗? (5认同)
  • @PicMickael是的!str.Empty也是如此。 (2认同)

小智 59

我用 :

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

empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
    return ""
  })) // false
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案更加语言无关.它依赖的唯一JavaScript功能是typeof.因此,当您不信任不同浏览器中的实现并且没有时间来获取更好的解决方案时,它就是您可以使用的解决方案的一个很好的示例.(IE,没有互联网接入).这就像一个证据.不是最干净的,但你可以肯定它会在不了解JavaScript的情况下发挥作用. (3认同)
  • 我会更进一步,并在未定义的情况下使用 === 运算符来确定它。否则,它只是完美的答案。 (2认同)
  • `case typeof(e) == "undefined":` 是错误的;匹配“false”的“e”,而不是“undefined”的“e”。显然这是一个获得批准的[建议编辑](/review/suggested-edits/25444037)。原来的 `case typeof this == "undefined":` 仍然没有任何意义。也没有理由将 `false`、`0` 和 `"0"` 视为“空”。 (2认同)
  • 这个函数对于 `isEmpty("0")` 返回 true,这对我来说是令人惊讶和不想要的行为。在 Javascript 中,“0”在布尔上下文中被评估为 true,因此我不希望它被视为空。 (2认同)

Kam*_*ski 48

表现

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

结论

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

在此处输入图片说明

细节

在下面的片段中,我通过使用不同的输入参数比较了所选 18 种方法的结果

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

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

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);
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

  • 有点误导,因为它结合了修剪解决方案和无修剪解决方案。 (2认同)

cll*_*pse 33

var s; // undefined
var s = ""; // ""
s.length // 0
Run Code Online (Sandbox Code Playgroud)

JavaScript中没有任何代表空字符串的内容.对任一个length(如果您知道var将始终是一个字符串)或反对进行检查""


小智 33

尝试:

if (str && str.trim().length) {  
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • 长度属性是否必要? (2认同)

T.T*_*dua 33

功能:

function is_empty(x)
{
   return ( 
        (typeof x == 'undefined')
                    ||
        (x == null) 
                    ||
        (x == false)  //same as: !x
                    ||
        (x.length == 0)
                    ||
        (x == "")
                    ||
        (x.replace(/\s/g,"") == "")
                    ||
        (!/[^\s]/.test(x))
                    ||
        (/^\s*$/.test(x))
  );
}
Run Code Online (Sandbox Code Playgroud)

ps在Javascript中,不要在使用Line-Break之后return;

  • 你有没有机会解释每张支票在做什么?:) (2认同)
  • -1他们正在测试不同的东西.将它们全部放入一个`if`语句是没有意义的. (2认同)
  • typeof MyVariable == 'undefined' 无法区分具有未定义值的初始化变量和未声明的变量,除非该变量最初声明并初始化为 null。检查 length 属性会导致字符串原语被包装在一个字符串对象中。 (2认同)

Mos*_*hii 33

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

它涵盖了很多类似的情况下{},'',null,undefined等.

但它总是返回trueNumber类型的Javascript基本数据类型一样_.isEmpty(10)_.isEmpty(Number.MAX_VALUE)两者的回报true.

  • @Erich 因为 `" "` 不为空。`_.isEmpty("");` 返回 true。 (2认同)

Chr*_*Noe 26

我不会太担心最有效的方法.使用最明确的意图.通常对我来说strVar == "".

编辑:根据Constantin的评论,如果strVar可能会有一些结果包含整数0值,那么这确实是那些意图澄清情况之一.

  • 馊主意.如果strVar被意外分配0,你会得到真的. (11认同)
  • 我同意明确表达你的意图比其他方法可能产生的任何微优化更重要,但使用[严格比较运算符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)/Operators/Comparison_Operators#Identity)`===`会更好.如果`strVar`是一个空字符串,它只返回true. (5认同)
  • @ValentinHeinitz如果str被赋值为0或"0",if(str)将错误地报告为true.最好的方法是if(str ==="").它很简单,永远不会失败. (3认同)

小智 19

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

if((/^\s*$/).test(str)) { }
Run Code Online (Sandbox Code Playgroud)

检查空字符串或用空格填充的字符串.


tfo*_*ont 17

很多答案,以及很多不同的可能性!

毫无疑问,快速和简单的实施赢家是: 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道,有点过分了.

  • 检查undefined需要在检查中移到第一位,否则未定义的项将在先前的检查中抛出异常. (2认同)

Tim*_*ene 16

  1. 检查是否var a;存在
  2. 修剪出false spaces值,然后测试emptiness

    if ((a)&&(a.trim()!=''))
    {
      // if variable a is not empty do this 
    }
    
    Run Code Online (Sandbox Code Playgroud)


小智 15

此外,如果您将填充空格的字符串视为"空".您可以使用此正则表达式进行测试:

!/\S/.test(string); // Returns true if blank.
Run Code Online (Sandbox Code Playgroud)


use*_*641 13

我经常使用这样的东西,

if (!str.length) {
//do some thing
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您知道变量是字符串,则最快.如果变量未定义,则会引发错误. (3认同)
  • @AbimaelMartell为什么不呢?您有一个变量,您声明的变量或从您无法控制的某个范围传递给您的变量,例如来自方法或API调用的响应.您可以假设它包含一个值并使用上面的检查,但如果它未定义或为null,则会出现错误.var test = null; if(!test.length){alert("adrian is wrong");} (2认同)

Abh*_*hra 12

从...开始:

return (!value || value == undefined || value == "" || value.length == 0);
Run Code Online (Sandbox Code Playgroud)

查看最后一个条件,如果 value == "",则其长度必须为 0。因此将其删除:

return (!value || value == undefined || value == "");
Run Code Online (Sandbox Code Playgroud)

可是等等!在 JavaScript 中,空字符串是假的。因此,丢弃值 == "":

return (!value || value == undefined);
Run Code Online (Sandbox Code Playgroud)

!undefined 是真的,所以不需要检查。所以我们有:

return (!value);
Run Code Online (Sandbox Code Playgroud)

我们不需要括号:

return !value
Run Code Online (Sandbox Code Playgroud)


sea*_*ean 10

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

if (!str?.trim()) {
  // do something...
}
Run Code Online (Sandbox Code Playgroud)

  • 只是把它扔给那些可能需要它的人。`?.` 再复杂不过了。如果“str”为空,“.trim()”会抛出错误。 (2认同)

小智 10

在简单地检查空字符串的情况下

if (str.length){
  //do something
}
Run Code Online (Sandbox Code Playgroud)

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

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


Bik*_*ush 9

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

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
Run Code Online (Sandbox Code Playgroud)

要测试其null,可以执行以下操作:

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

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

  • 有趣的分析.我不认为这与99.9%的案件有关.但我最近发现,如果(并且仅当)该列包含空字符("\ 0"),MySQL会将列计算为"null".另一方面,Oracle不会将"\ 0"评估为null,而是将其视为长度为1的字符串(其中一个字符为空字符).如果处理不当,这可能会引起混淆,因为许多Web开发人员确实使用后端数据库,后端数据库可能会传递不同类型的"null"值.它应该落在每个开发人员的脑海中. (2认同)

And*_*ron 9

所有这些答案都很好.

但我不能确定变量是一个字符串,不包含空格(这对我来说很重要),并且可以包含'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
Run Code Online (Sandbox Code Playgroud)

关于jsfiddle的示例.

  • 嗯?如果你期待一个字符串,`empty(0)` 和 `empty(7)` 应该返回相同的值。 (2认同)

Jos*_*f.B 9

如果一个人不仅需要检测空字符串而且还需要空白字符串,我将添加Goral的答案:

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

function isBlank(s){
    return isEmpty(s.trim());    
}
Run Code Online (Sandbox Code Playgroud)


Imr*_*ran 9

同时我们可以使用一个函数来检查所有'空,',如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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用例和结果.

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
Run Code Online (Sandbox Code Playgroud)


Ibr*_*eem 8

if ((str?.trim()?.length || 0) > 0) {
   // str must not be any of:
   // undefined
   // null
   // ""
   // " " or just whitespace
}
Run Code Online (Sandbox Code Playgroud)

更新: 由于这个答案越来越流行,我想我也会写一个函数形式:

const isNotNilOrWhitespace = input => (input?.trim()?.length || 0) > 0;

const isNilOrWhitespace = input => (input?.trim()?.length || 0) === 0;
Run Code Online (Sandbox Code Playgroud)

  • 您能给出更多解释吗? (2认同)

小智 7

我经常使用类似的东西:

if (str == "") {
     //Do Something
}
else {
     //Do Something Else
}
Run Code Online (Sandbox Code Playgroud)

  • `==` 运算符并不严格。因此,如果 `str == ""`,则 `str` 可以是 `null`、`undefined`、`false`、`0`、`[]` 等。 (4认同)

小智 7

试试这个

str.value.length == 0
Run Code Online (Sandbox Code Playgroud)

  • `“” .value.length`将导致错误。它应该是`str.length === 0` (3认同)
  • 如果“str”等于“undefined”或“null”,则会引发“TypeError” (2认同)

Wil*_*ill 7

我使用组合,最快的检查是第一次.

function isBlank(pString){
    if (!pString || pString.length == 0) {
        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);
}
Run Code Online (Sandbox Code Playgroud)

  • 只是想知道您是否可以解释何时需要进行长度检查?!pString不会捕获任何为空/空字符串的东西吗?这似乎有效。var test =''; if(!test)alert('empty'); (2认同)
  • 直到十年后我才看到这条评论。但是,是的,你是对的,我会更新。:) (2认同)

mri*_*cci 7

忽略空白字符串,您可以使用它来检查null,empty和undefined:

var obj = {};
(!!obj.str) //returns false

obj.str = "";
(!!obj.str) //returns false

obj.str = null;
(!!obj.str) //returns false
Run Code Online (Sandbox Code Playgroud)

简洁,它适用于未定义的属性,虽然它不是最易读的.


小智 7

我做了一些研究,如果将非字符串和非空/空值传递给测试器函数会发生什么.众所周知,(0 =="")在javascript中是正确的,但由于0是一个值而不是空或null,您可能想要测试它.

以下两个函数仅对undefined,null,empty/whitespace值返回true,对其他所有值返回false,如数字,布尔值,对象,表达式等.

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

存在更复杂的例子,但这些例子很简单并且给出了一致的结果.没有必要测试undefined,因为它包含在(value == null)检查中.您也可以通过将它们添加到String来模仿C#行为,如下所示:

String.IsNullOrEmpty = function (value) { ... }
Run Code Online (Sandbox Code Playgroud)

您不希望将它放在Strings原型中,因为如果String类的实例为null,则会出错:

String.prototype.IsNullOrEmpty = function (value) { ... }
var myvar = null;
if (1 == 2) { myvar = "OK"; } // could be set
myvar.IsNullOrEmpty(); // throws error
Run Code Online (Sandbox Code Playgroud)

我测试了以下值数组.如果有疑问,你可以循环测试你的功能.

// 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 js
    ['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; } }]
];
Run Code Online (Sandbox Code Playgroud)


Luc*_* C. 7

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

if(val==="")...
Run Code Online (Sandbox Code Playgroud)

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

if(!val)...
Run Code Online (Sandbox Code Playgroud)


Ali*_*eza 7

您可以轻松地将其添加到JavaScript中的本机String对象中,并一遍又一遍地重复使用... 如果您想检查空字符串,则像下面的代码这样简单的事情就可以为您完成这项工作:
''

String.prototype.isEmpty = String.prototype.isEmpty || function() {
  return !(!!this.length);
}
Run Code Online (Sandbox Code Playgroud)

否则,如果您想同时检查''空字符串和' '空格,则只需添加即可trim(),例如下面的代码:

String.prototype.isEmpty = String.prototype.isEmpty || function() {
   return !(!!this.trim().length);
}
Run Code Online (Sandbox Code Playgroud)

您可以这样称呼:

''.isEmpty(); //return true
'alireza'.isEmpty(); //return false
Run Code Online (Sandbox Code Playgroud)


Har*_*wal 7

到目前为止,还没有像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.

}
Run Code Online (Sandbox Code Playgroud)

使用此方法,您还可以确保字符串也未定义或为null。记住,未定义,null和empty是三件事。


V1N*_*NNY 7

尝试这个:

export const isEmpty = string => (!string || !string.length);
Run Code Online (Sandbox Code Playgroud)


Agu*_*hez 6

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

if (typeof test === 'string' && test.length === 0){
  ...
Run Code Online (Sandbox Code Playgroud)

类型检查是必要的,以避免运行时错误时testundefinednull.


KAR*_*N.A 6

您可以验证以下方式并了解差异。

var j = undefined;
console.log((typeof j == 'undefined') ? "true":"false");
var j = null; 
console.log((j == null) ? "true":"false");
var j = "";
console.log((!j) ? "true":"false");
var j = "Hi";
console.log((!j) ? "true":"false");
Run Code Online (Sandbox Code Playgroud)


小智 6

这里有很多有用的信息,但在我看来,最重要的元素之一没有得到解决。

null, undefined, 和""都是假的

在评估空字符串时,通常是因为您需要将其替换为其他内容。

在这种情况下,您可以期待以下行为。

var a = ""
var b = null
var c = undefined

console.log(a || "falsy string provided") // prints ->"falsy string provided"
console.log(b || "falsy string provided") // prints ->"falsy string provided"
console.log(c || "falsy string provided") // prints ->"falsy string provided"
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,可以返回字符串是"", null, 或undefined(无效字符串)还是有效字符串的方法或函数就像这样简单:

const validStr = (str) => str ? true : false

validStr(undefined) // returns false
validStr(null) // returns false
validStr("") // returns false
validStr("My String") // returns true
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助。


Kri*_*nov 6

检查它是否是字符串类型并且它是否不为空:

const isNonEmptyString = (val) => typeof val === 'string' && !!val
Run Code Online (Sandbox Code Playgroud)


Kev*_*Kev 5

不要假设您检查的变量是字符串.不要假设如果这个var有一个长度,那么它就是一个字符串.

问题是:仔细考虑您的应用必须做什么并且可以接受的内容.建立强大的东西.

如果你的方法/函数只应处理非空字符串,那么测试参数是否为非空字符串并且不做"技巧".

作为一个例子,如果你在这里不小心遵循一些建议会爆炸.


var getLastChar = function (str) {
 if (str.length > 0)
   return str.charAt(str.length - 1)
}

getLastChar('hello')
=> "o"

getLastChar([0,1,2,3])
=> TypeError: Object [object Array] has no method 'charAt'

所以,我坚持下去


if (myVar === '')
  ...


Saz*_*zid 5

您也应该始终检查类型,因为 JavaScript 是一种鸭子类型语言,因此您可能不知道数据在过程中何时以及如何更改。所以,这是更好的解决方案:

    let undefinedStr;
    if (!undefinedStr) {
      console.log("String is undefined");
    }
    
    let emptyStr = "";
    if (!emptyStr) {
      console.log("String is empty");
    }
    
    let nullStr = null;
    if (!nullStr) {
      console.log("String is null");
    }
Run Code Online (Sandbox Code Playgroud)


Tha*_*ers 5

Underscore.js JavaScript库,http://underscorejs.org/,提供了一个非常有用的_.isEmpty()用于检查空字符串和其他空对象的功能。

参考:http : //underscorejs.org/#isEmpty

isEmpty _.isEmpty(object)
如果可枚举对象不包含任何值(没有可枚举的自身属性),则返回 true。对于字符串和类似数组的对象 _.isEmpty 检查 length 属性是否为 0。

_.isEmpty([1, 2, 3]);
=> 假

_.isEmpty({});
=> 真

其他非常有用的 Underscore.js 函数包括:


小智 5

以下正则表达式是另一种解决方案,可用于 null、空或未定义的字符串。

(/(null|undefined|^$)/).test(null)
Run Code Online (Sandbox Code Playgroud)

我添加了这个解决方案,因为它可以进一步扩展以检查空值或某些值,如下所示。以下正则表达式正在检查字符串是否可以为空 null 未定义或它只有整数。

(/(null|undefined|^$|^\d+$)/).test()
Run Code Online (Sandbox Code Playgroud)

  • 一个主要缺陷:此正则表达式与字符串文字“null”匹配。`(/(null|undefined|^$)/).test("null")` (2认同)

小智 5

我在这里看不到好的答案(至少不是一个适合我的答案),所以我决定自己回答:

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

您需要开始检查它是​​否未定义,否则您的方法可能会爆炸,而不是检查是否等于null或等于空字符串

你不能拥有!或仅if(value) 当您检查后才0会给您一个错误的答案(0为错误)

这么说,用下面的方法包装它:

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

PS。您不需要检查typeof,因为它甚至在进入方法之前都会爆炸。


小智 5

您可以使用 typeof 运算符和 length 方法来检查这一点。

const isNonEmptyString = (value) => typeof(value) == 'string' && value.length > 0
Run Code Online (Sandbox Code Playgroud)


Ani*_*AOU 5

试试这个代码:

function isEmpty(strValue)
{
    // Test whether strValue is empty
    if (!strValue || strValue.trim() === "" ||
        (strValue.trim()).length === 0) {
        // Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 条件末尾的“(strValue.trim()).length === 0)”的用途是什么?`strValue.trim() === ""` 不是多余的吗? (3认同)

归档时间:

查看次数:

2756353 次

最近记录:

6 年,2 月 前