typeof 最安全通用,可检测未声明变量而不报错,返回 "undefined";但无法区分未声明与声明未赋值;in 和 object.hasown 仅适用于全局变量;try/catch 开销大不推荐;if(foo) 有严重隐患。

直接用 typeof 检测最安全、最通用,它不会因变量未声明而报错。
用 typeof 判断(推荐)
这是唯一能安全检测“未声明变量”的方法。因为对未声明的变量使用 typeof 不会抛出错误,而是返回字符串 "undefined"。
-
typeof foo === "undefined"→ 表示foo未声明,或已声明但值为undefined - 注意:它无法区分“未声明”和“声明了但没赋值”,但对绝大多数运行时检查场景已足够
- 适用于任何作用域(全局、函数、块级),无需关心执行环境
在全局作用域中查 window 或 global
仅适用于**全局变量**,且只在浏览器(window)或 Node.js(global)环境中有效。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
"foo" in window→ 确认foo是window的自有或继承属性 -
Object.hasOwn(window, "foo")(ES2022+)→ 更精确地判断是否为window自有属性 - 不适用于函数内
var、let、const声明的局部变量
用 try/catch 包裹访问
当需要严格区分“未声明”和“值为 undefined”时可用,但开销略大,不建议常规使用。
try { foo; } catch (e) { /* e 是 ReferenceError → 未声明 */ }- 若不报错,说明变量存在(但可能为
undefined、null等) - 仅适合明确知道变量名且需强校验的少数逻辑,比如插件兼容性探测
避免用 if(foo) 直接判断
这种写法有严重隐患:
- 如果
foo未声明,会直接抛出ReferenceError,中断执行 - 即使已声明,
if(foo)也会把0、""、false、null、undefined都判为“不存在”,语义不准确 - 不能用于检测变量是否被定义,只能用于检测“是否为真值”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










