引言:为什么这个任务比看起来简单
每个写过JavaScript的开发者都遇到过需要检查字符串是否为空,或者它可能是null或undefined的情况。看起来,这能有多难?但老实说:你写过多少次if (str == ""),然后当变量是null时遇到了bug?又有多少次你试图在undefined上调用.trim(),然后在控制台中看到了红色错误?
这个话题是Stack Overflow上最热门的问题之一,有数万次浏览。这并非没有原因。在JavaScript中有很多细微差别,将简单的检查变成了雷区。在本文中,我们将分析所有可能的方法,从最显而易见到最专业的,并找出在你的项目中最好使用哪一种。
我们将讨论什么是falsy值,==和===运算符如何工作,以及为什么""和0与false不同。到文章结束时,你将确切知道如何编写一个不会出错的通用检查。
问题:什么被认为是“空”字符串?
在编写代码之前,我们需要明确定义我们在检查什么。在“How do I check for an empty/undefined/null string in JavaScript?”这个问题的上下文中,我们通常指的是三种状态:
- 空字符串 (
""或'') — 长度为零的字符串。 - null — 有意缺失的值。
- undefined — 变量已声明但未初始化。
但还有第四种隐含情况:仅由空格组成的字符串 (" ")。从业务逻辑的角度来看,它通常也被认为是“空”的。我们将分析所有情况。
方法1:逻辑转换(最简单)
最流行且简洁的方法是使用JavaScript在布尔上下文中自动将值转换为true或false这一事实。
let str = "";
if (!str) { console.log("字符串为空、null或undefined");} else { console.log("字符串不为空");}这段代码适用于""、null、undefined、0、NaN和false。为什么?因为所有这些值在JavaScript中都被认为是falsy。如果你确定变量是一个字符串(或者可能是null/undefined),那么这种方法就足够了。
但有一个陷阱:如果变量等于0(数字),那么检查也会说“空”。如果这很关键,那么这种方法就不合适。
方法2:严格比较(显式控制)
如果你想尽可能精确,只检查上述三种状态,请使用严格比较 (===)。
function isEmptyOrNull(str) { return str === "" || str === null || str === undefined;}
console.log(isEmptyOrNull("")); // trueconsole.log(isEmptyOrNull(null)); // trueconsole.log(isEmptyOrNull(undefined)); // trueconsole.log(isEmptyOrNull("hello")); // falseconsole.log(isEmptyOrNull(0)); // false (数字不会通过)这段代码运行起来没有意外。它不会将0或false与空字符串混淆。但它不处理仅包含空格的字符串。
方法3:Trim + 检查(针对“真正的”空值)
用户经常在表单中输入空格,而字符串" "在视觉上看起来是空的。为了也捕获这些情况,我们需要使用.trim()方法修剪空格。
function isBlank(str) { return !str || str.trim() === "";}
console