最稳妥的方式是依赖 typeof,其次是 void 0;typeof 判断不访问变量值、不报错且适用范围广,void 0 能规避 undefined 被重写风险,而直接与 undefined 比较存在安全隐患。

检测 JavaScript 中的 undefined 类型,核心在于区分“未声明”“已声明未赋值”“显式赋值为 undefined”这三种情况,同时避开 undefined 被重写的潜在风险。最稳妥的方式是依赖 typeof,其次是 void 0。
用 typeof 判断最安全
typeof 返回字符串 "undefined",它不访问变量值,因此不会因变量未声明而报错,适用范围最广。
- 适用于已声明但未赋值的变量:
let a; typeof a === "undefined"→true - 适用于完全未声明的变量:
typeof undeclaredVar === "undefined"→true(不抛错) - 在严格模式或模块环境下依然可靠,是官方推荐的通用方案
用 void 0 避免 undefined 被篡改
void 操作符总是返回真正的 undefined,不受全局 undefined 是否被重新赋值的影响,适合对安全性要求高的场景。
-
variable === void 0等价于variable === undefined,但更健壮 -
void 0和void(0)效果相同,括号可省略 - 常见于压缩工具、底层库或需要防御性编码的项目中
慎用直接与 undefined 比较
虽然 variable === undefined 写法简洁,但它依赖全局 undefined 的原始值未被修改——而历史上确实存在重写 undefined 的代码(尽管现代环境已极少发生)。
- 仅适用于已声明的变量;若变量未声明,会触发
ReferenceError - 在非严格模式下,
window.undefined = "hacked"可能导致误判 - ES6 模块默认启用严格模式,降低了风险,但仍不推荐作为首选
其他方法适用场景有限
部分方式有明确限制,不建议作为主方案使用。
-
in操作符只能查全局对象属性(如"myVar" in window),无法检测局部变量 -
window.myVar === undefined同样受限于浏览器环境和作用域,且仍受undefined重写影响 - 利用假值判断(如
!variable)会把null、0、false、""一并纳入,语义模糊,不可取
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











