在 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