为什么检查 null、undefined 和空值是每个 JavaScript 开发者的痛点?
\n\n你是否曾经有过这样的想法:“为什么我又要写这个冗长的 if (x !== null && x !== undefined && x !== '') 结构?”如果是这样,你并不孤单。Stack Overflow 上的问题 “Is there a standard function to check for null, undefined, or blank variables in JavaScript?” 已经获得了数千次浏览。这并非偶然。
JavaScript 没有 内置 函数可以一次性检查所有情况。但这并不意味着我们注定要受苦。在本文中,我们将探讨为什么没有这样的函数,如何优雅地绕过这个限制,并编写我们自己的理想辅助函数。
\n\n准备好将混乱的检查转变为干净、清晰的代码了吗?我们开始吧!
\n\nJavaScript 中的 null、undefined 和 blank(空字符串)是什么?
\n\n在寻找“灵丹妙药”之前,让我们先弄清楚我们面对的是什么。这三个概念是三种不同的东西,混淆它们是很危险的。
\n\n- \n
- undefined — 变量已声明,但未赋值。这是 JavaScript 的“默认值”。 \n
- null — 变量存在,但被有意赋值为“无”。这是开发者的有意识选择。 \n
- blank(空字符串) —
''或""。字符串存在,但没有字符。 \n
关键区别:null 是一个对象(是的,这是 JS 的历史性 bug,现在成了特性),undefined 是一种特殊类型,而空字符串是一个字符串。
let a; // undefined\nlet b = null; // null\nlet c = ''; // 空字符串 (blank)\nconsole.log(typeof a); // "undefined"\nconsole.log(typeof b); // "object" (是的,就是这样!)\nconsole.log(typeof c); // "string"\n\n现在想象一下:你想检查一个变量在任何意义上是否为“空”。普通的 if (!value) 检查适用于 null 和 undefined,但 不会考虑 空字符串吗?不,它会考虑!因为空字符串是一个 falsy 值。但有一个陷阱...
为什么简单的 if (!value) 是个坏主意?
\n\n是的,if (!value) 会捕获 null、undefined、''、0、false 和 NaN。但如果 0 或 false 是你的变量的 有效 值呢?例如,如果你检查购物车中的商品数量,0 是正常的,而不是“空”。
function processOrder(itemCount) {\n if (!itemCount) {\n console.log('错误:没有商品!');\n } else {\n console.log('正在处理订单...');\n }\n}\nprocessOrder(0); // 错误:没有商品! — 这不是错误,这是 0 件商品\n\n这就是为什么我们需要一个 专门的 函数,而不是通用的“真值”检查。
\n\n标准函数?不,但有标准模式
\n\n对于问题“Is there a standard function?”,答案是 没有。但 JavaScript 提供了灵活的工具,让你可以编写自己的函数。这甚至更好,因为你的函数将完全符合你的业务需求。
\n\n方案 1:最简单的检查(严格)
\n\n如果你只需要检查 null 和 undefined — 使用 严格比较 (===)。这是最安全的方式。
function isNullOrUndefined(value) {\n return value === null || value === undefined;\n}\n\nconsole.log(isNullOrUndefined(null)); // true\nconsole.log(isNullOrUndefined(undefined)); // true\nconsole.log(isNullOrUndefined('')); // false\nconsole.log(isNullOrUndefined(0)); // false\n\n优点:不会将 0 和空字符串与“无”混淆。缺点:不检查空