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


2847

我看到了这个问题,但是没有看到JavaScript特定的示例。string.EmptyJavaScript中是否有一个简单的可用工具,还是仅用于检查的情况""


2
仅供参考,我认为String类最有用的API在Mozillajavascript kit上。[elated.com](elated.com/articles/working-with-strings)提供了有关String的所有属性,方法的教程,...请注意:Mozilla链接已更新至developer.mozilla.org/en/ JavaScript /参考/ Global_Objects /…
基因T


如果明确规定了要求,将大有帮助。isEmpty应该返回什么值true?检查“”表示仅当值是Type字符串且长度为0时,它才应返回true。此处的许多答案都假定它对于某些或所有false值也应返回true。
RobG

Answers:


3563

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

if (strValue) {
    //do something
}

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

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

172
实际上,测试length属性可能比测试针对“”的字符串要快,因为解释器不必从字符串文字中创建String对象。
文森特·罗伯特,

24
@Vincent在Chrome开发人员工具中进行了一些简单的分析,测试=== ''vs .length并没有显示任何明显的改进(并且.length只有在可以假设您有字符串的情况下才使用)
bdukes 2010年

26
@bdukes当您开始关心这种微优化时,我认为Chrome并不是您遇到大多数性能问题的浏览器...
文森特·罗伯特2010年

15
仅需注意,如果您对“空字符串”的定义包含空格,则此解决方案不合适。包含1个或更多空格的字符串在上面返回true。如果您正在使用JQuery,你可以简单地使用这样的:如果($ .trim(REF)。长度=== 0) -按这个回答类似的问题:stackoverflow.com/questions/2031085/...
CodeClimber

115
.length > 0实际上比预期的要快于与字符串文字的比较!看看这个jsPerf
乍得

1127

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

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

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

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

用于检查字符串是否为空白或仅包含空格:

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

21
为什么0 === str.length而不是str.length === 0?
文森特

66
@Vincent条件通常是这样写的if (variable == constant value),如果您忘记了“ =”,则将常量值分配给变量而不是进行测试。该代码仍然可以使用,因为您可以在if中分配变量。因此,写此条件的更安全方法是反转常数值和变量。这样,当您测试代码时,您会看到一个错误(分配中的左手无效)。您还可以使用JSHint之类的东西来禁止条件分配,并在编写条件时发出警告。
florian 2013年

2
/^\s*$/.test(str)很难理解的耻辱-也许使用更简单的代码或正则表达式删除空格会更好?看到stackoverflow.com/questions/6623231/...stackoverflow.com/questions/10800355/...
阿德里安成为

6
/^\s*$/.test(str)可以替换为str.trim()。length === 0
Schadenfreude

21
@Vincent也称为“ Yoda条件” if blue is the sky。请参阅dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
AZ。

316

先前的所有答案都不错,但这会更好。使用!!不是)运算符。

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

或使用类型转换:

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

两者执行相同的功能。将变量类型转换为布尔值,其中str是变量。
它返回falsenull,undefined,0,000,"",false
返回true字符串“ 0”和空格“”。


61
为什么这个“更好”?
Mene

33
是否有行为之间的区别if(str)if(!!str)
彼得·奥尔森

6
@PeterOlson,如果您尝试将变量另存为检查多个字符串内容的布尔值,那么您将要执行此操作。.也可以var any = (!!str1 && !!str2 && !!str3)处理其中是否存在数字
John Ruddell 2015年

23
这是我一直使用的解决方案。!!str.trim()确保该字符串不是仅由空格组成。
Dario Oddenino '16

5
不是看起来像黑客,Boolean(str)而是更具可读性和更少的“ wtfish”。
shinzou


99

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

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

8
但是,如果您实际要测试的是具有非空格内容的字符串,则可以完成该工作。有没有便宜的方法可以测试呢?
Flash

4
长度属性怎么样?
driAn 2010年

27
而不是删除所有空格,为什么不只检查是否存在一个非空格?有2个优点,即如果有非空格字符,它可以尽早解决,并且没有返回新的字符串,您可以随后检查该字符串。if(str.match(/\S/g)){}
mpen 2011年

34
@Mark FYI,您不需要全局修饰符,因为首次出现的非空格字符匹配将表示字符串不为空:str.match(/\S/)
neezer 2011年

1
为什么这么贵?如果确实如此,那么jQuery为什么使用此方法?您可以在jQuery的源代码中找到它var trimLeft = /^\s+/, trimRight = /\s+$/;
Marecky 2012年

66

我用:

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

5
此解决方案与语言无关。它依赖的唯一JavaScript功能是typeof。因此,这是一个很好的解决方案示例,当您不信任不同浏览器中的实现并且没有时间获取更好的解决方案时,可以使用它。(即,无法访问互联网)。就像证明。不是最干净的,但您可以肯定会在不了解JavaScript的情况下正常运行。
杰夫·戴维斯

2
我还要走得更远,并为未定义的情况添加===运算符。否则,这仅仅是完美的答案。
xarlymg89

typeofswitch没有为我工作。我添加了一个if (typeof e == "undefined")测试,并且可以正常工作。为什么?
卢卡斯

1
@Lucas因为这是拼写错误或疏忽大意。您的修改是正确的方法。(原始指向空函数的上下文,而不是e参数,这是函数应该检查的内容)
beeThree

我们可以case undefined:代替使用case typeof(e) == "undefined":吗?
Boris J.

43

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

它涵盖了很多类似的情况下{}''nullundefined,等。

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


_.isEmpty(" "); // => false
埃里希

1
@Erich因为" "不为空。_.isEmpty("");返回true。
Moshii

1
的确如此-我之所以提到这一点,是因为这里的其他一些答案暗示了格式验证和检查字符串是否仅包含空格,而这个单一的lodash函数本身无法解决该问题。
埃里希

@Erich,现在我明白了,谢谢。
Moshii

36

功能:

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

PS:在JavaScript中,请勿在之后使用换行符return


1
您是否有机会解释每张支票的用途?:)
DanV

2
-1他们正在测试不同的事物。将它们全部放在一个if语句中是没有意义的。
Bennett McElwee'4

1
typeof MyVariable =='undefined'不会区分具有未定义值的初始化变量和未声明的变量,除非该变量最初被声明并初始化为null。检查length属性会导致字符串基元被包装在字符串对象中。
Scott Marcus

35

尝试:

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

2
是否需要length属性?
frogcoder '17

str.trim().lengthstr.trim()根据我自己的测试结果,速度会比快1%。
devildelta

2
@devildelta-您的1%是测试错误。
Stephen M Irving

OP正在寻找测试空字符串,未定义或null的方法。这是在测试不是所有这些条件的字符串。他也没有说仅空格字符串。只要确保没有其他数据类型存储在变量中,就可以使用此方法测试OP的条件: if (!str) { ... }
Stephen M Irving

34
var s; // undefined
var s = ""; // ""
s.length // 0

JavaScript中没有任何内容代表空字符串。对照length(如果您知道var始终是字符串)或对照""


29

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

根据康斯坦丁(Constantin)的评论,如果strVar最终可以包含整数0,那么这确实是意图澄清的情况之一。


11
馊主意。如果strVar意外分配为0,您将为真。–
Constantin

5
我同意明确您的意图比其他方法可能产生的任何微优化更重要,但是使用严格的比较运算符 ===会更好。如果strVar为空字符串,则仅返回true 。
没用的代码

如果未定义,则检查失败。因此,如果(str)运作得更好
Valentin Heinitz 2015年

3
@ValentinHeinitz如果为str分配的假值为0或“ 0”,则if(str)将错误地报告为true。最好的方法是if(str ===“”)。这很简单,它永远不会失败。
Scott Marcus


20

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

毫无疑问,快速简便的实现是: 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 '16

完全同意!不错的选择。我将编辑以上答案!
tfont

str.length === 0对于没有形式参数的任何函数,返回true。
RobG

20

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

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

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


它可以工作,但在操作上也非常昂贵。如果您只想检查一两个东西,而不是一大堆,那很好。
奥菲斯2015年

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

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

18

性能

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

结论

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

在此处输入图片说明

细节

在下面的代码段中,我将使用不同的输入参数来比较选择的18种方法的结果

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

并非所有测试方法都支持所有输入情况。

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

在此处输入图片说明


真是太棒了!我喜欢看到所有这些布置!谢谢!
WebWanderer

这是一项彻底的研究-谢谢
Deian

17

另外,如果您将填充空格的字符串视为“空”。

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

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

14

我通常用这样的东西

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

3
如果您知道变量是字符串,则最快。如果变量未定义,则会引发错误。
Adrian Hope-Bailie 2014年

@ AdrianHope-Bailie为什么要测试未定义的变量?
Abimael Martell

2
@AbimaelMartell为什么不呢?您有一个声明的变量,或者是从某个范围传递给您的变量,您无法控制该范围,例如方法或API调用的响应。您可以假定它包含一个值,并使用上面的检查,但是如果未定义或为空,则会出现错误。var test = null; if(!test.length){alert(“ adrian是错误的”));}
Adrian Hope-Bailie 2014年

OP要求输入“如何检查空字符串”,未定义的变量不是空字符串。无论如何,您可以typeof variable != "undefined"在检查是否为空之前进行检查。
Abimael Martell

10

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

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
有趣的分析。我认为这在99.9%的情况下都不重要。但是我最近发现,当(且仅当)该列包含空字符(“ \ 0”)时,MySQL将该列评估为“空”。另一方面,Oracle不会将“ \ 0”评估为空,而是将其视为长度为1的字符串(其中一个字符为空字符)。如果处理不当,可能会引起混乱,因为许多Web开发人员的确使用后端数据库,而后端数据库可能会传递不同类型的“空”值。它应该在每个开发人员的脑海中。
cartbeforehorse 2012年

10

同时,我们可以使用一个函数来检查所有“空”,例如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

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

}

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


它将在null或undefined上引发错误,因为我们不应该直接对null或undefined的变量执行操作-如其他答案所述,在执行此操作之前检查str是否确实存在,并注意这将对let abc起作用='',但不让let abc ='',这两个是不同的。
whoami

考虑let rand = ()=>Math.random(),然后rand && rand.length > 0)返回false,但显然fn不是“空”。即,对于没有格式参数的任何函数,它返回false。
RobG

@RobG Math.random()返回数字而不是字符串。这个答案是关于字符串的。;-)
Harshit Agarwal19年

10

所有这些答案都很好。

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


1
??如果你期待一个字符串,empty(0)empty(7)应返回相同的值。
Bennett McElwee'4

在我的特殊情况下- empty("0")必须返回false(因为它不是一个空字符串),但empty(0)必须返回,true因为它为空:)
Andron 2014年

但是0 不为空!这是一个数字,数字不能是完整的或空的。当然,这是您的职能,因此必须满足您的要求,但是empty在这种情况下,这是一个令人误解的名称。
Bennett McElwee 2014年

我觉得这个名字empty很好。在php docs中,函数:和此函数Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE.之间的区别PHP-该字符串'0'不会被标识为空。
安德隆(Andron)2014年

正如我所说,这是您的功能:随心所欲地调用它。但这empty是一个不准确且具有误导性的名称。有趣的是,PHP也具有一个命名错误的empty函数,但是PHP的失败与JavaScript没有任何关系。
Bennett McElwee 2014年

10

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

所以我决定回答自己:

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

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

你不能拥有!或仅if(value)当您选中0该选项后才会给出错误答案(0为错误)。

话虽如此,将其包装为以下方法:

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

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


最好使用Boolean(value)构造,该构造将未定义和空值(以及0,-0,false,NaN)视为false。见stackoverflow.com/questions/856324/...
ZHURAVLEV A.

9

如果不仅需要检测空字符串,还需要检测空白字符串,我将在Goral的答案中添加:

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

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


8

您可以轻松地将它添加到本地字符串对象的JavaScript又一遍地重复使用......
一些简单的像下面的代码可以,如果你要检查你做的工作''空字符串:

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

这样做!(!!this.length)不仅是!this(或!this.trim()为第二种选择)有什么好处?零长度的字符串已经很虚假,括号是多余的,对它进行三次否定与否定一次完全相同。
约翰·蒙哥马利

8

尝试这个:

export const isEmpty = string => (!string || !string.length);

8

我对将非字符串和非空/空值传递给测试器函数时会发生的情况进行了一些研究。众所周知,(0 ==“”)在JavaScript中为true,但是由于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中来模拟C#行为,如下所示:

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 ===“”)问题。
Scott Marcus

8

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

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

要检查它是一个空字符串还是一个无值的逻辑等效项(null,undefined,0,NaN,false,...):

if(!val)...

7

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

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

为避免在testis undefined或时发生运行时错误,需要进行类型检查null


7

忽略空格字符串,您可以使用它来检查null,空和未定义:

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.