如何在 JavaScript 中检查空/未定义/空字符串?

How do I check for an empty/undefined/null string in JavaScript?

提问人:casademora 提问时间:10/1/2008 最后编辑:Mateen Ulhaqcasademora 更新时间:10/30/2023 访问量:5325080

问:

JavaScript 中是否有,或者只是检查的情况?string.Empty""

javascript null 为空

评论

5赞 Gene T 10/2/2008
仅供参考,我认为 String 类最有用的 API 在 Mozillajavascript 工具包中。[elated.com](elated.com/articles/working-with-strings ) 有一个关于 String 的所有属性和方法的教程,...请注意:Mozilla链接已更新为 developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
0赞 Himanshu Shekhar 5/13/2019
检查这个: stackoverflow.com/a/36491147/7026966
2赞 RobG 10/16/2019
如果明确规定要求,将有很大帮助。对于哪些值,isEmpty 应返回 true?检查 “” 推断,仅当值为 Type string 且长度为 0 时,它才应返回 true。这里的许多答案都假设它也应该为部分或所有 false 值返回 true。
0赞 Omar bakhsh 1/31/2021
str.length > -1
0赞 Flimm 8/11/2021
我完全同意@RobG,这个问题定义不好。你到底为什么要考虑或空?空字符串是空字符串,它不是或nullundefinednullundefined

答:

4892赞 bdukes 10/1/2008 #1

空字符串、未定义、null、...

要检查真实值,请执行以下操作:

if (strValue) {
    // strValue was non-empty string, true, 42, Infinity, [], ...
}

要检查虚假值

if (!strValue) {
    // strValue was empty string, false, 0, null, undefined, ...
}

空字符串(仅!

要检查是否准确无空字符串,请与使用 === 运算符进行严格相等性比较:""

if (strValue === "") {
    // strValue was empty string
}

要严格检查不为空字符串,请使用 !== 运算符

if (strValue !== "") {
    // strValue was not an empty string
}

评论

278赞 Vincent Robert 10/2/2008
测试 length 属性实际上可能比针对 “” 测试字符串更快,因为解释器不必从字符串文本创建 String 对象。
78赞 bdukes 9/27/2010
@Vincent在 Chrome 开发人员工具中进行一些幼稚的分析,但测试 vs 没有显示出任何明显的改进(并且只有在您可以假设您有一个字符串时才有效)=== ''.length.length
46赞 Vincent Robert 9/28/2010
@bdukes当你开始关心这种微优化时,我不认为Chrome是你遇到大部分性能问题的浏览器......
40赞 CodeClimber 10/3/2011
请注意,如果你对“空字符串”的定义包含空格,那么这个解决方案是不合适的。包含 1 个或多个空格的字符串将返回上面的 true。如果您使用的是 JQuery,您可以简单地使用它: if ($.trim(ref).length === 0) - 根据类似问题的答案: stackoverflow.com/questions/2031085/...
153赞 Chad 11/29/2011
正如预期的那样,实际上比与字符串文字相比要快得多!看看这个 jsPerf.length > 0
32赞 Chris Noe 10/1/2008 #2

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

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

评论

13赞 Constantin 10/1/2008
坏主意。如果 strVar 意外分配为 0,则会得到 true。
5赞 Useless Code 6/14/2015
我同意,明确你的意图比其他方法可能产生的任何微优化都更重要,但使用严格的比较运算符会更好。仅当为空字符串时,它才返回 true。===strVar
0赞 Valentin H 12/27/2015
如果未定义,则检查失败。所以如果(str)效果更好
4赞 Scott Marcus 1/29/2016
@ValentinHeinitz 如果为 str 分配了 0 或“0”的假值,if(str) 将错误地报告 true。最好的方法是 if(str === “”)。这很简单,永远不会失败。
42赞 cllpse 10/1/2008 #3
var s; // undefined
var s = ""; // ""
s.length // 0

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

评论

0赞 Flimm 8/11/2021
我不明白这句话:.怎么样,那不是代表一个空字符串吗?There's nothing representing an empty string in JavaScript. ""
133赞 Ates Goral 10/1/2008 #4

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

if (!str.length) { ...

评论

27赞 Pic Mickael 9/11/2018
这不会抛出异常是str为null吗?
7赞 Ates Goral 9/12/2018
@PicMickael 是的!所以会.str.Empty
0赞 Flimm 8/11/2021
请注意,字符串并不是唯一具有属性的变量类型。数组也是如此。length
116赞 Sugendran 10/1/2008 #5

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

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

评论

8赞 flash 10/22/2010
但是,如果您实际要测试的是具有非空格内容的字符串,则可以完成这项工作。有没有更便宜的方法来测试这一点?
4赞 driAn 11/11/2010
长度属性怎么样?
30赞 mpen 6/20/2011
与其删除所有空格,不如检查是否有非空格呢?有 2 个优点,如果存在非空格字符,它可以提前救助,并且它不会返回一个新字符串,然后您可以对其进行检查。if(str.match(/\S/g)){}
34赞 neezer 6/27/2011
@Mark仅供参考,您不需要全局修饰符,因为第一次出现非空格字符的匹配意味着字符串不为空:str.match(/\S/)
2赞 Ates Goral 12/8/2016
也许比因为它不费心返回一组匹配的结果(可能是微观性能提升)更好。此外,当只是针对正则表达式测试字符串时,请使用 RegExp 方法可以更好地传达该意图。/\S/.test(str)str.match(/\S/).test()
7赞 jmc734 2/15/2010 #6

我通常使用类似的东西:

if (str == "") {
     //Do Something
}
else {
     //Do Something Else
}

评论

4赞 alexandre-rousseau 9/11/2019
==运算符不严格。所以如果 ,可以是 、 、 、 、 等。str == ""strnullundefinedfalse0[]
21赞 oem 5/31/2010 #7

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

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

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

评论

1赞 Orpheus 5/12/2015
它有效,但在运维方面也非常昂贵。如果你只想检查一两件事,而不是一大套,那就太好了。
78赞 Jet 7/10/2010 #8

我使用:

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

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

评论

6赞 Jeff Davis 4/20/2012
此解决方案与语言无关。它唯一依赖的 JavaScript 功能是 typeof。因此,这是一个很好的解决方案示例,当您不信任不同浏览器中的实现并且没有时间获取更好的解决方案时,您可以使用该解决方案。(IE,无法访问互联网)。这有点像一个证明。不是最干净的,但您可以确定它可以在不了解 JavaScript 的情况下工作。
2赞 xarlymg89 1/25/2018
我会走得更远一点,并为未定义的情况使用 === 运算符来钉住它。否则,它只是完美的答案。
1赞 Lucas 4/17/2018
里面对我不起作用。我添加了一个测试,这很有效。为什么?typeofswitchif (typeof e == "undefined")
2赞 Sebastian Simon 7/2/2021
case typeof(e) == "undefined":是错误的;匹配 的 ,而不是 的。显然,这是一个建议的编辑,得到了批准。原版仍然没有任何意义。也没有理由考虑 、 和 “空”。efalseundefinedcase typeof this == "undefined":false0"0"
2赞 Flimm 8/11/2021
此函数返回 true for ,这对我来说是令人惊讶和不需要的行为。在 Javascript 中,在布尔上下文中计算为 true,因此我不希望它被视为空。isEmpty("0")"0"
1418赞 Jano González 7/16/2010 #9

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

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

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

同时,您可以使用(不是这样)新可选的链接和箭头函数来简化:

const isEmpty = (str) => (!str?.length);

它将检查长度,如果值为空,则返回,而不会引发错误。如果为空值,则为零,结果仍然有效。undefined

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

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

如果你愿意,你可以像这样对原型进行猴子修补String

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());

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

评论

47赞 Vincent 9/23/2013
为什么 0 === str.length 而不是 str.length === 0 ?
133赞 grandouassou 9/23/2013
@Vincent 条件通常是这样写的,如果你忘记了“=”,那么你就是在为变量赋值,而不是测试。该代码仍将起作用,因为您可以在 if 中分配变量。因此,编写此条件的更安全方法是反转常量值和变量。这样,当您测试代码时,您会看到一个错误(赋值中的左手方无效)。您还可以使用类似 JSHint 的东西来禁止在条件中分配,并在编写条件时收到警告。if (variable == constant value)
12赞 Schadenfreude 6/19/2015
/^\s*$/.test(str) 可以替换为 str.trim().length === 0
51赞 AZ. 1/26/2016
@Vincent这也被称为“尤达条件”,比如.查看 dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.htmlif blue is the sky
3赞 Stephen M Irving 1/9/2020
不过,扩展原生原型并不是一个好主意,这通常被认为是一种不好的做法,很多人只是建议不要完全这样做,因为有更安全的方法也同样好。这里有一个关于这个话题的 SO 讨论,但我读过的每一本 JS 编程书籍都强烈建议不要这样做。对于OP问题,我通常只做if (!str) { // i am sure str is empty null or undefined here if I'm sure it won't be another data type }
7赞 Doug 7/22/2010 #10

试试这个

str.value.length == 0

评论

6赞 AndFisher 12/14/2016
"".value.length将导致错误。它应该是str.length === 0
2赞 alexandre-rousseau 9/11/2019
此 trow a If 等于 或TypeErrorstrundefinednull
4赞 Muhammad Salman 8/7/2010 #11
function tell()
{
    var pass = document.getElementById('pasword').value;
    var plen = pass.length;

    // Now you can check if your string is empty as like
    if(plen==0)
    {
        alert('empty');
    }
    else
    {
        alert('you entered something');
    }
}

<input type='text' id='pasword' />

这也是检查字段是否为空的通用方法。

554赞 karthick.sk 3/30/2011 #12

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

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

或者使用类型转换:

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

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

  • 它返回 、 、 、 、 。falsenullundefined0000""false

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

评论

57赞 Peter Olson 12/20/2014
和的行为有什么区别吗?if(str)if(!!str)
7赞 John Ruddell 3/11/2015
@PeterOlson,如果您尝试将变量保存为布尔值,以检查多个字符串的内容,那么您需要这样做。如果其中也有数字,也要处理var any = (!!str1 && !!str2 && !!str3)
51赞 Dario Oddenino 2/11/2016
这是我经常使用的解决方案。 以确保字符串不是仅由空格组成。!!str.trim()
29赞 shinzou 10/18/2016
不是看起来不像黑客,可读性更强,更少“wtfish”。Boolean(str)
11赞 Oli Crt 9/8/2020
这在 中是毫无用处的,它将 falsy 值转换为 ,将 truey 值转换为 。一个块要么执行,要么不执行,取决于表达式是否真实,添加是没有意义的iffalsetrueif!!
14赞 Will 6/1/2011 #13

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

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);
}

评论

3赞 Nicholi 10/28/2011
只是想知道您是否可以解释何时需要进行长度检查?!pString 不会捕获任何空/空字符串吗?这似乎有效。var 测试='';if (!test) alert('empty');
2赞 Will 7/5/2021
直到十年后,我才看到这条评论。但是,是的,你是对的,我会更新的。:)
1赞 Nicholi 7/7/2021
结合我们的知识,一次十年:)
0赞 Will 7/17/2021
@Nicholi 2031年见!
8赞 mricci 7/19/2012 #14

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

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

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

obj.str = null;
(!!obj.str) // Returns false

它简明扼要,适用于未定义的属性,尽管它不是最易读的。

评论

0赞 Flimm 8/11/2021
您在这里检查真实性,这比仅仅检查空字符串要复杂一些,或者undefinednull
13赞 Bikush 7/31/2012 #15

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

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 空或空格字符(即不间断空格、字节顺序标记、行/段落分隔符等)。

评论

2赞 cartbeforehorse 10/20/2012
有趣的分析。我认为这在 99.9% 的情况下无关紧要。但是我最近发现,当(且仅当)该列包含空字符(“\0”)时,MySQL将该列评估为“null”。另一方面,Oracle 不会将“\0”评估为 null,而是将其视为长度为 1 的字符串(其中该字符为 null 字符)。如果处理不当,这可能会导致混淆,因为许多 Web 开发人员确实使用后端数据库,该数据库可能会传递不同类型的“null”值。它应该在每个开发人员的脑海中。
3赞 dkinzer 12/19/2012 #16

检查您是否没有尝试传递未定义的术语也是一个好主意。

function TestMe() {
  if((typeof str != 'undefined') && str) {
    alert(str);
  }
 };

TestMe();

var str = 'hello';

TestMe();

我通常会遇到这样的情况:当对象实例的字符串属性不为空时,我想做一些事情。这很好,只是该属性并不总是存在。

41赞 Yang Dong 1/9/2013 #17

尝试:

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

评论

0赞 devildelta 3/6/2019
str.trim().length会比 快 ,根据我自己的测试结果,大约快 1%。str.trim()
0赞 Stephen M Irving 1/9/2020
OP 正在测试空字符串、未定义或 null。这是针对不属于任何这些条件的字符串的测试。他也没说空格,只说字符串。你可以用这个来测试OP的条件,只要你确定变量中没有存储其他数据类型:if (!str) { ... }
2赞 GibboK 2/10/2013 #18

另一种方式,但我相信 bdukes 的答案是最好的。

var myString = 'hello'; 
if(myString.charAt(0)){
    alert('no empty');
}
alert('empty');
10赞 Andron 5/9/2013 #19

所有这些答案都很好。

但是我不能确定变量是一个字符串,不只包含空格(这对我来说很重要),并且可以包含“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 上的示例。

评论

2赞 Bennett McElwee 4/2/2014
哼?如果您需要一个字符串,并且应该返回相同的值。empty(0)empty(7)
0赞 Andron 4/2/2014
在我的特殊情况下 - 必须返回(因为这不是一个不为空的字符串),但必须返回,因为它是空:)empty("0")falseempty(0)true
0赞 Bennett McElwee 4/3/2014
但 0 不是空的!这是一个数字,数字不能是满的或空的。当然,这是您的职能,因此必须满足您的要求,但在这种情况下是一个误导性的名称。empty
0赞 Andron 4/3/2014
我觉得这个名字很好。在空函数的 php 文档中:和这个函数之间的区别 - 该字符串不会被标识为空。emptyReturns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.PHP'0'
0赞 Bennett McElwee 4/4/2014
正如我所说,这是你的功能:随心所欲地称呼它。但是一个不准确和误导性的名字。有趣的是,PHP也有一个名字不好的函数,但PHP的失败与JavaScript没有任何关系。emptyempty
11赞 JHM 5/14/2013 #20

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

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

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

存在更复杂的示例,但这些示例很简单,并且给出了一致的结果。无需测试 undefined,因为它包含在 (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; } }]
];

评论

0赞 Scott Marcus 1/29/2016
如果您只是停止使用 == 并使用 ===,那么这解决了 if(s === “”) 的问题。
18赞 Wab_Z 5/15/2013 #21

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

您可以使用以下正则表达式对其进行测试:

!/\S/.test(string); // Returns true if blank.
4赞 Mubashar 7/3/2013 #22

我更喜欢使用非空白测试而不是空白

function isNotBlank(str) {
   return (str && /^\s*$/.test(str));
}

评论

3赞 Mike Viens 5/2/2019
在函数名称中加入否定是一个坏主意。你的代码本身很好,但这个函数应该被称为hasValue()。为什么?当您看到这样的代码时会发生什么:“if (!isNotBlank(str))”...目前尚不清楚意图应该是什么。对于这个简单的示例,它可能看起来与您无关,但是在函数名称中添加否定始终是一个坏主意。
0赞 Mubashar 5/2/2019
IsNotBlank 是一个标准函数,也是 StringUtils commons.apache.org/proper/commons-lang/apidocs/org/apache/ 中非常流行的函数......
0赞 Mubashar 5/2/2019
它还提供了 IsBlank 以避免双重否定。我相信函数名称应该反映它们执行的功能,当开发人员在同一类中看到 isBlank 和 IsNotBlank 函数时,他们会更容易看到理解。
6赞 Kev 7/15/2013 #23

不要假定您检查的变量是字符串。不要假设如果这个 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 === '')
  ...

评论

0赞 Flimm 8/11/2021
这个答案应该固定在顶部。
20赞 user2086641 8/9/2013 #24

我通常使用这样的东西,

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

评论

4赞 Adrian Hope-Bailie 2/20/2014
如果您知道变量是字符串,则最快。如果变量未定义,则引发错误。
0赞 Abimael Martell 4/1/2014
@AdrianHope-Bailie为什么要测试一个未定义的变量?
3赞 Adrian Hope-Bailie 4/1/2014
@AbimaelMartell 为什么不呢?您有一个变量,该变量要么是您声明的,要么是从某个您无法控制的作用域传递给您的,例如在方法或 API 调用的响应中。您可以假设它包含一个值并使用上面的检查,但如果它未定义或为 null,您将收到错误。var 测试 = null;if(!test.length){alert(“阿德里安错了”);}
0赞 Abimael Martell 4/2/2014
OP 询问“如何检查空字符串”,un undefined 变量不是空字符串。无论如何,您可以在检查是否为空之前进行检查。typeof variable != "undefined"
43赞 T.Todua 2/28/2014 #25

非常通用的“多合一”功能(但不推荐):

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))
    );
}

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

评论

3赞 DanV 3/21/2014
你有机会解释一下每张支票在做什么吗?:)
4赞 Bennett McElwee 4/2/2014
-1 他们正在测试不同的东西。把它们都放在一个语句中是没有意义的。if
2赞 Scott Marcus 1/29/2016
typeof MyVariable == 'undefined' 无法区分具有未定义值的初始化变量和未声明的变量,除非该变量最初声明并初始化为 null。检查 length 属性会导致字符串基元包装在字符串对象中。
-1赞 Gaurav 4/8/2014 #26
var x ="  ";
var patt = /^\s*$/g;
isBlank = patt.test(x);
alert(isBlank); // Is it blank or not??
x = x.replace(/\s*/g, ""); // Another way of replacing blanks with ""
if (x===""){
    alert("ya it is blank")
}
5赞 Sazid 5/6/2014 #27

您也应该始终检查类型,因为 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");
    }

评论

0赞 Flimm 8/11/2021
第一个条件适用于任何 falsey 值,而不仅仅是 。此答案不检查类型。undefined
-10赞 Alban Kaperi 7/20/2014 #28

要检查它是否为空:

var str = "Hello World!";
if(str === ''){alert("THE string str is EMPTY");}

要检查它是否为字符串类型:

var str = "Hello World!";
if(typeof(str) === 'string'){alert("This is a String");}

评论

3赞 Green 12/30/2015
错。 莫。 不。但总的来说,你的方法还可以。lengthnullstr = ''; str.length == 0str.length == null
0赞 Scott Marcus 1/29/2016
检查 length 属性将导致字符串原语包装在字符串对象中,并且检查 null 也是不正确的,因为它不会查找 undefined(这不是一回事)。要测试空字符串,只需对照 “” 检查它(即 if(myString === “”))
16赞 Josef.B 10/1/2014 #29

如果不仅需要检测空字符串,还需要检测空白字符串,我会补充 Goral 的答案:

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

function isBlank(s){
    return isEmpty(s.trim());    
}
21赞 Timothy Nwanwene 2/24/2015 #30
  1. 检查是否存在var a;
  2. 剪掉 in 值,然后测试false spacesemptiness

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

评论

0赞 Flimm 8/11/2021
该字符串不为空,但在此条件下将被视为空。" "
4赞 Thaddeus Albers 6/10/2015 #31

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

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

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

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

_.isEmpty({});
=> 真

其他非常有用的下划线.js函数包括:

22赞 tfont 3/31/2016 #32

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

毫无疑问,对于快速和简单的实施,获胜者是: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;
}

有点过分,我知道。

评论

2赞 SvdSinner 6/16/2016
检查未定义需要移动到检查中的第一位,否则未定义的项将在前面的检查中引发异常。
0赞 tfont 6/17/2016
完全同意!不错的收获。我会编辑我上面的答案!
0赞 RobG 10/16/2019
str.length === 0对于没有形式参数的任何函数,返回 true。
0赞 Praveen M P 11/3/2020
str.length === 0 ||str === “” 两者都将执行相同的任务。
9赞 Agustí Sánchez 11/5/2016 #33

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

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

为了避免在 is 或 时出现运行时错误,需要进行类型检查。testundefinednull

评论

0赞 Flimm 8/11/2021
我很确定是等价的,而且它更短。test === ""
61赞 Moshi 8/17/2017 #34

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

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

但它总是返回 JavaScript 原始数据类型的类型,例如或两者都返回。trueNumber_.isEmpty(10)_.isEmpty(Number.MAX_VALUE)true

评论

0赞 Erich 2/13/2020
_.isEmpty(" "); // => false
2赞 Moshi 3/25/2020
@Erich 因为不是空的。 返回 true。" "_.isEmpty("");
1赞 Erich 3/26/2020
完全正确 - 我之所以提到这一点,是因为这里的其他一些答案暗示了表单验证和检查字符串是否仅由空格组成,而这个单一的 lodash 函数本身并不能解决这个问题。
7赞 Alireza 10/7/2017 #35

您可以轻松地将其添加到 JavaScript 中的原生 String 对象中,并一遍又一遍地重用它......
如果您想检查空字符串,像下面的代码这样简单的东西可以为您完成这项工作:
''

String.prototype.isEmpty = String.prototype.isEmpty || function() {
  return !(!!this.length);
}

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

String.prototype.isEmpty = String.prototype.isEmpty || function() {
   return !(!!this.trim().length);
}

你可以这样称呼它:

''.isEmpty(); //return true
'alireza'.isEmpty(); //return false

评论

0赞 John Montgomery 2/4/2020
除了(或第二种选择)之外,这样做有什么好处?零长度字符串已经是假的,括号是多余的,否定它三次与否定一次完全相同。!(!!this.length)!this!this.trim()
1赞 sean 12/4/2020
请不要污染原型。
0赞 Flimm 8/11/2021
像这样使用猴子补丁通常被认为是不好的做法。
5赞 KARTHIKEYAN.A 11/30/2017 #36

您可以验证以下方法并了解其中的区别。

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");

11赞 Imran Ahmad 3/12/2018 #37

同时,我们可以有一个函数来检查所有“空”,如 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
10赞 oviniciusfeitosa 5/11/2019 #38

试试这个:

export const isEmpty = string => (!string || !string.length);
4赞 Japesh 10/18/2019 #39

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

(/(null|undefined|^$)/).test(null)

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

(/(null|undefined|^$|^\d+$)/).test()

评论

2赞 sean 12/4/2020
一个主要缺陷:此正则表达式与字符串文字“null”匹配。(/(null|undefined|^$)/).test("null")
11赞 Davi Daniel Siepmann 10/24/2019 #40

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

所以我决定回答自己:

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

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

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

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

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

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

评论

0赞 Zhuravlev A. 11/29/2019
可能最好使用 Boolean(value) 构造,将未定义的和 null 值(以及 0、-0、false、NaN)视为 false。查看 stackoverflow.com/questions/856324/...
70赞 Kamil Kiełczewski 1/1/2020 #41

性能

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

结论

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

Enter image description here

在下面的代码片段中,我通过使用不同的输入参数比较了所选 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);

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

Enter image description here

评论

2赞 sean 12/4/2020
有点误导,因为它结合了修剪解决方案和无修剪解决方案。
14赞 Abhishek Luthra 2/10/2020 #42

开始于:

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

查看最后一个条件,如果 value == “”,则其长度必须为 0。因此,请放下它:

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

但是等等!在 JavaScript 中,空字符串为 false。因此,drop 值 == “”:

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

undefined 为 true,因此不需要检查。所以我们有:

return (!value);

而且我们不需要括号:

return !value

评论

0赞 nerez 4/28/2020
如果 或 会发生什么情况。你会根据问题返回正确的答案吗?value = falsevalue = 0
25赞 Ibraheem 8/24/2020 #43
if ((input?.trim()?.length || 0) > 0) {
   // input must not be any of:
   // undefined
   // null
   // ""
   // " " or just whitespace
}

或以函数形式:

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

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

解释:

如果为 或,则 null 合并将导致 将是 或 。ORing() 将给出 . 不是 因此结果将是 ,即它是一个 nil 值。inputundefinednull?.input?.trim()?.lengthundefinednull||000> 0false

如果为空或空格,则将删除前导和结束空格,这将使空输入保持不变,并将任何空格转换为空值。空字符串的长度为 ,如上所述,不是 ,因此结果将是 ,即它是空的或只是空格。input.trim()00> 0false

如果是任何其他字符串,则调用后其长度>将为 0,因此结果将是 ,即它不是零值,也不是空或只有空格。input.trim()true

评论

2赞 gfan 12/7/2021
你能多解释一下吗?
0赞 Ibraheem 5/14/2023
添加说明
0赞 Thomas 7/1/2023
为什么这么复杂?怎么样const isNilOrWhitespace = input => !input?.trim();
22赞 trn450 11/6/2020 #44

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

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"

考虑到这一点,可以返回字符串是否为 、 或(无效字符串)与有效字符串的方法或函数就这么简单:""nullundefined

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

validStr(undefined) // returns false
validStr(null) // returns false
validStr("") // returns false
validStr("My String") // returns true

请注意,您可能还想要字符串,因为 .trim()"" !== " "

评论

0赞 Zi Sang 8/2/2023
谢谢,我喜欢你的anwser,它是如此简单。所以只需使用: if (str) { //一些代码 } 当 str 不是 null && 不是 undefined && 不是空字符串时,if 条件为 true
0赞 trn450 12/6/2023
是的,你可以这样做。但是,您可能希望确保没有空的空白。因为:不等同于后者不是假的。js const emptStr = "" js const notEmptyStr = " "
10赞 sean 12/4/2020 #45

使用 null-coalescing 运算符修剪空格:

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

评论

0赞 Hexodus 2/23/2021
它看起来很酷,但 str.trim() 就足够了。IMO永远不应该把事情过于复杂化。
2赞 sean 2/24/2021
只是把它扔给那些可能需要它的人。 再复杂不过了。 如果为 null,则会抛出错误。?..trim()str
5赞 Tasos Tsournos 1/15/2021 #46

您可以使用 typeof 运算符和 length 方法进行检查。

const isNonEmptyString = (value) => typeof(value) == 'string' && value.length > 0
-1赞 Labham Jain 7/4/2021 #47

好吧,检查这一点的最简单功能是......

const checkEmpty = string => (string.trim() === "") || !string.trim();

用法:

checkEmpty(""); // returns true.
checkEmpty("mystr"); // returns false.

就是这么简单。:)

评论

1赞 Flimm 8/11/2021
这将返回 true,即使对于包含空格的不为空的字符串也是如此,例如" "
4赞 CrazyStack 8/22/2021 #48

isBlank 函数的最终和最短变体:

/**
 * Will return:
 * False for: for all strings with chars
 * True for: false, null, undefined, 0, 0.0, "", " ".
 *
 * @param str
 * @returns {boolean}
 */
function isBlank(str){
    return (!!!str || /^\s*$/.test(str));
}

// tests
console.log("isBlank TRUE variants:");
console.log(isBlank(false));
console.log(isBlank(undefined));
console.log(isBlank(null));
console.log(isBlank(0));
console.log(isBlank(0.0));
console.log(isBlank(""));
console.log(isBlank(" "));

console.log("isBlank FALSE variants:");
console.log(isBlank("0"));
console.log(isBlank("0.0"));
console.log(isBlank(" 0"));
console.log(isBlank("0 "));
console.log(isBlank("Test string"));
console.log(isBlank("true"));
console.log(isBlank("false"));
console.log(isBlank("null"));
console.log(isBlank("undefined"));

5赞 Anis KCHAOU 10/8/2021 #49

试试这个代码:

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

评论

3赞 pys 12/27/2021
病症结束时的目的是什么?这不是多余的吗?(strValue.trim()).length === 0)strValue.trim() === ""
4赞 Ali Yaghoubi 10/14/2021 #50

这是一个虚假的值

第一个解决方案:

const str = "";
return str || "Hello"

第二种解决方案:

const str = "";
return (!!str) || "Hello"; // !!str is Boolean

第三种解决方案:

const str = "";
return (+str) || "Hello"; // !!str is Boolean

评论

1赞 devildelta 11/17/2021
当输入不是数字时,第三种解决方案基本上是错误的,因此解析结果也将是 。NaNfalsy
0赞 sMyles 11/10/2021 #51

以下是我用于处理此问题的一些自定义函数。以及代码运行方式的示例。

const v1 = 0
const v2 = '4'
const v2e = undefined
const v2e2 = null
const v3 = [1, 2, 3, 4]
const v3e = []
const v4 = true
const v4e = false
const v5 = {
  test: 'value'
}
const v5e = {}
const v6 = 'NotEmpty'
const v6e = ''

function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n)
}

function isEmpty(v, zeroIsEmpty = false) {
  /**
   * When doing a typeof check, null will always return "object" so we filter that out first
   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof#typeof_null
   */
  if (v === null) {
    return true
  }

  if (v === true) {
    return false
  }

  if (typeof v === 'object') {
    return !Object.keys(v).length
  }

  if (isNumeric(v)) {
    return zeroIsEmpty ? parseFloat(v) === 0 : false
  }

  return !v || !v.length || v.length < 1
}

console.log(isEmpty(v1), isEmpty(v1, true))
console.log(isEmpty(v2), isEmpty(v2e), isEmpty(v2e))
console.log(isEmpty(v3), isEmpty(v3e))
console.log(isEmpty(v4), isEmpty(v4e))
console.log(isEmpty(v5), isEmpty(v5e))
console.log(isEmpty(v6), isEmpty(v6e))

同样作为参考,这里是 Lodash isEmpty 的来源

5赞 Kristiyan Tsvetanov 12/7/2022 #52

检查它是否为字符串类型,以及它是否不为空:

const isNonEmptyString = (val) => typeof val === 'string' && !!val
1赞 mtotowamkwe 3/16/2023 #53

使用核心(阅读普通)javascript,我们可以利用 Object.is() 进行严格的相等性比较。下面是一个代码片段。

function validateString(arg) {
 if (Object.is(arg, "") || Object.is(arg, null) || Object.is(arg, undefined)) {
      return false;
 }
 return true;
}

以下是 JavaScript 规范:https://262.ecma-international.org/12.0/#sec-object.is

这是Mozilla文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is

希望这会有所帮助。

0赞 perona chan 5/11/2023 #54

完整的示例。用于类型 、 和Object.keys()stringarrayobject

function isEmpty(input){
    switch(typeof input){
      case 'undefined': return true
      case 'string':
      case 'object':
         return Object.keys(input).length == 0
      case 'boolean':
      case 'bigint':
      case 'number': return input == 0
    }
}
function log(...logs){
   for(let i = 0;i < logs.length;i++){
     if(i % 2 == 1){
        console.log(logs[i - 1],'=', logs[i])
     }
   }
}
log(
   isEmpty(),      'empty undefined',   // true
   isEmpty(''),    'empty string',      // true
   isEmpty('abc'), 'empty string',      // false
   isEmpty([]),    'empty array',       // true
   isEmpty([2,3]), 'empty array',       // false
   isEmpty({}),    'empty object',      // true
   isEmpty({a: 'abc'}), 'empty object', // false
   isEmpty(false), 'empty boolean',     // true
   isEmpty(true),  'empty boolean',     // false
   isEmpty(0n),    'empty bigint',      // true
   isEmpty(2n),    'empty bigint',      // false
   isEmpty(0),     'empty number',      // true
   isEmpty(2),     'empty number'       // false
)