在 JavaScript 中,undefined 是一个原始值,表示变量已声明但未赋值。然而,在非严格模式(sloppy mode)下,undefined 并不是一个保留字,可以被重新赋值,这可能导致代码出现难以预料的错误。
// ⚠️ 危险!在非严格模式下允许(不推荐)
undefined = "hacked";
console.log(someUndefinedVar); // 期望是 undefined,但可能被污染
因此,获取一个“安全”的、真正 undefined 的值非常重要。
一、安全获取 undefined 值的方法
✅ 方法 1:使用 void 0(推荐)
void 操作符会计算其后的表达式,但总是返回 undefined,无论表达式是什么。
const safeUndefined = void 0;
// 常见写法:void 0, void 1, void "anything"
if (value === void 0) {
console.log("value is truly undefined");
}
优点:
- 最安全、最高效。
- 不受
undefined是否被重写的影响。 - 在压缩后代码中通常更短(如
void 0→void 0)。
✅ 方法 2:使用未定义的变量(在函数参数中)
在函数内部,未定义的形参默认值就是 undefined。
(function(safeUndefined) {
// safeUndefined 的值就是真正的 undefined
if (value === safeUndefined) {
// ...
}
})(undefined); // 即使全局 undefined 被改写,传入的 undefined 仍是原始值
或者使用立即调用函数表达式(IIFE)的默认参数:
(function(global) {
// global.undefined 可能被改写
const undefined = void 0; // 在函数内部重新定义为安全值
})(this);
✅ 方法 3:使用 typeof 检查(用于判断,不用于获取值)
虽然不能“获取” undefined,但可以安全地判断一个变量是否为 undefined:
if (typeof someVar === "undefined") {
// 即使 someVar 未声明,也不会报错
// 安全!因为 typeof 对未声明变量返回 "undefined"
}
注意:
typeof variable === "undefined"是检查变量是否未声明或值为undefined的安全方式。
✅ 方法 4:ES5+ 环境中使用全局对象(较安全)
在浏览器中,window.undefined 是只读的(在 ES5+ 中 undefined 是不可写、不可配置的)。
const safeUndefined = window.undefined; // 浏览器环境
// 或
const safeUndefined = globalThis.undefined; // 通用(ES2020)
但在 Node.js 或其他环境中,需确保 global.undefined 未被修改。
二、不推荐的方法
❌ 直接使用 undefined
if (value === undefined) { } // 如果 undefined 被重写,可能出错
❌ 使用未声明的变量
value === someUndeclaredVar // ReferenceError!会报错
三、现代开发中的最佳实践
- 使用严格模式:在代码顶部添加
"use strict";,在严格模式下,undefined不能被重新赋值。 - 使用
void 0:在需要“安全 undefined”的地方,使用void 0。 - 使用
typeof检查:判断变量是否为undefined时,优先使用typeof variable === "undefined"。 - 使用现代工具:TypeScript、ESLint 等可以帮助检测潜在问题。
总结
| 方法 | 是否安全 | 说明 |
|---|---|---|
void 0 | ✅ 最安全 | 推荐,不受 undefined 重写影响 |
typeof x === "undefined" | ✅ 安全 | 用于判断,不会报错 |
globalThis.undefined | ✅(现代环境) | ES2020 标准,通常安全 |
直接使用 undefined | ⚠️ 有风险 | 在非严格模式下可能被污染 |
一句话:void 0 是获取安全 undefined 值的最佳方式,因为它始终返回真正的 undefined,且性能高、兼容性好。
THE END


