“变量未定义”:为什么这个问题困扰着所有人?
\n\n如果你曾经写过JavaScript代码,你一定遇到过这种情况:运行代码,控制台中出现红色提示 Uncaught TypeError: Cannot read properties of undefined。或者更糟——null is not an object。熟悉吗?这是最常见的一种错误,困扰着各个级别的开发者。
“How can I determine if a variable is 'undefined' or 'null'?”这个问题在Stack Overflow上获得了数千次浏览和数百个回答。这并非偶然:在JavaScript中,这两个值看起来很相似,但行为却不同。在2025年,当代码变得更加复杂、项目规模更大时,正确检查 undefined 和 null 的能力已从“最好知道”变成了“必须掌握”。
在本文中,我们将解析所有检查方法,从简单到高级,并展示在现代开发中应该使用哪些方法。开始吧!
\n\nundefined vs null:有什么区别?
\n\n在开始检查之前,让我们先弄清楚我们面对的是什么。在JavaScript中,undefined 和 null 是两个不同的原始值,各自拥有自己的类型。
undefined
\nundefined 是当你声明了一个变量但没有赋值时,自动分配给该变量的值。同样,如果一个函数没有显式的 return 语句,它会返回 undefined。
let myVar;\nconsole.log(myVar); // undefined\n\nfunction doNothing() {}\nconsole.log(doNothing()); // undefined\n\nconsole.log(someNonExistentVariable); // ReferenceError,但如果访问对象的属性:\nconst obj = {};\nconsole.log(obj.prop); // undefined\n\n\nnull
\nnull 是开发者有意分配的值。它表示“空”、“无”、“值不存在”。从 typeof 的角度来看,null 是一个对象(是的,这是一个历史遗留的bug,但它已经成为了一种特性)。
let myVar = null;\nconsole.log(myVar); // null\nconsole.log(typeof myVar); // "object" — 是的,就是这样!\n\n\n主要区别:undefined 是“尚未赋值”,而 null 是“有意为空”。但在非严格比较下,它们是相等的:
console.log(null == undefined); // true\nconsole.log(null === undefined); // false\n\n\n正是由于这种非严格相等性导致了混淆。因此,2025年的最佳实践建议使用严格比较(===)。
检查undefined和null的5种最佳方法
\n\n让我们解析所有流行的方法,从最简单到最现代。我们将根据三个标准对每种方法进行评估:可读性、可靠性和性能。
\n\n1. 严格比较(===)——黄金标准
\n最直接、最清晰的方法是通过 === 将变量直接与 undefined 或 null 进行比较。
let value = null;\n\n// 检查是否为null\nif (value === null) {\n console.log('这是null');\n}\n\n// 检查是否为undefined\nif (value === undefined) {\n console.log('这是undefined');\n}\n\n// 检查是否为null 或 undefined(分别检查)\nif (value === null || value === undefined) {\n console.log('值不存在');\n}\n\n\n为什么这是最佳实践?
\n- \n
- 可读性最高——任何开发者都能理解你在检查什么。 \n
- 没有意外的类型转换。 \n
- 适用于所有JavaScript版本,包括最旧的版本。 \n
缺点:如果需要同时检查两个值,必须编写两个条件。但这可以通过像上面示例中的 || 运算符来解决。
2. 空值合并运算符(??)——已被广泛采用的新特性
\n从ES2020开始,JavaScript引入了 ?? 运算符(nu