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

3976
在 JavaScript 中是否有类似于 string.Empty 的方法,或者只需要检查 "" 是否为空?

5
仅供参考,我认为String类最有用的API在Mozillajavascript kit上。elated.com提供了关于String所有属性、方法的教程...请注意:Mozilla链接已更新为https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String。 - Gene T
2
如果需求明确指定,那将会非常有帮助。isEmpty 应该在什么情况下返回 true?检查 "" 暗示它只应在值为字符串类型且长度为 0 时返回 true。这里的许多答案都假设它也应该对某些或所有 falsy 值返回 true。 - RobG
str.length > -1 - Omar bakhsh
我完全同意@RobG的观点,这个问题定义得很糟糕。你为什么会认为nullundefined是空的呢?一个空字符串就是一个空字符串,它不是nullundefined - Flimm
@GeneT的链接已经失效,这里提供Mozilla参考文档的更新链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String - randy
显示剩余2条评论
54个回答

41

尝试:

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

根据我的测试结果,str.trim().lengthstr.trim() 更快,大约快1%。 - devildelta
OP想要测试空字符串、未定义或null。这是测试不符合这些条件的字符串。他也没有提到仅包含空格的字符串。只要确保变量中没有存储其他数据类型,您就可以使用以下代码测试OP的条件:if (!str) { ... } - Stephen M Irving

32

我认为不需要过于担心最高效的方法,应使用最清晰明了的方法来表达意图。对我而言,通常会使用strVar == ""

根据Constantin 的评论,如果 strVar 可能包含一个整数 0 值,那么这就是一种需要明确意图的情况。


13
不好的想法。如果 strVar 被意外赋值为0,你会得到一个真值。 - Constantin
5
我认同表达清晰的重要性比其他方法可能产生的微观优化更为重要,但是使用“严格比较运算符” === 会更好。它只有在 strVar 是一个空字符串时才返回 true。 - Useless Code
如果未定义,则检查失败。因此,如果(str)更好用。 - Valentin H
4
如果将变量str赋值为假值0或"0",if(str)会错误地报告为真。最好的方法是使用if(str === "")。这种方法简单明了,而且绝不会出错。 - Scott Marcus
1
在 JavaScript 比较中应该使用哪个等于运算符(== vs ===)? - Brent Bradburn

25
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;

说明:

如果inputundefinednull,则空值合并运算符?.将导致input?.trim()?.lengthundefinednull。使用逻辑或运算符(||)连接0将得到00不是> 0,因此结果将为false,即它是一个零值。

如果input为空或只包含空格,则.trim()将删除前导和尾随空格,这将使空输入保持不变,并将任何空格转换为一个空值。然后空字符串的长度为0,并且像上面一样,0不是> 0,因此结果将为false,即它是空的或仅包含空格。

如果input是任何其他字符串,则在调用.trim()后其长度将大于0,因此结果将为true,即它不是空值,也不是仅包含空格的值。

2
请问您能否给予更多的解释? - gfan
Explanation added - Ibraheem
为什么这么复杂?const isNilOrWhitespace = input => !input?.trim(); 这样怎么样? - Thomas

22

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

毫无疑问,对于快速和简单的实现,赢家是: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
完全同意!很好的发现。我会编辑我的上面的回答! - tfont
如果一个函数没有形式参数,那么 str.length === 0 将返回 true。 - RobG
str.length === 0 || str === "" 都可以完成相同的任务。 - Praveen M P

22

这里有很多有用的信息,但我认为最重要的元素没有被提到。

nullundefined""都是“假值”(falsy)。

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

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

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"

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

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

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

谢谢,我喜欢你的回答,它很简单。所以只需使用:if (str) { //一些代码 } 当str不为null && 不为undefined && 不为空字符串时,if条件为真 - Zi Sang

21

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

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

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


1
它可以运行,但操作起来成本极高。如果你只想检查一两个东西,那还不错,但对于大型数据集就不太适用了。 - Orpheus

21
  1. 检查变量var a;是否存在
  2. 去除值中的false spaces,然后测试是否为空

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

字符串“ ”并不为空,但是根据这个条件它会被视为为空。 - Flimm

20

我通常使用类似这样的东西,

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

4
如果您知道变量是字符串类型,这将是最快的选择。如果变量未定义,会抛出错误。 - Adrian Hope-Bailie
@AdrianHope-Bailie 为什么要测试一个未定义的变量? - Abimael Martell
3
@AbimaelMartell 为什么不呢?你有一个变量,可能是你声明的,也可能是从某个你无法控制的作用域(比如从方法或API调用的响应中)传递给你的。你可以假设它包含一个值,并使用上面的检查,但如果它未定义或为空,你将会收到一个错误。 var test = null; if(!test.length){alert("adrian is wrong");} - Adrian Hope-Bailie
OP在询问如何检查空字符串,未定义的变量不是空字符串。无论如何,您可以在检查是否为空之前先检查typeof variable != "undefined" - Abimael Martell

18

此外,如果您认为一个只包含空格的字符串是“空”的话。

您可以使用这个正则表达式进行测试:

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

16

如果需要检测不仅是空字符串还包括空格字符串,我将添加到Goral的回答:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接