最安全通用的方法是 typeof 变量名 === 'undefined',它不报错且覆盖未声明和已声明未赋值两种情况;直接用 === undefined 会因未声明变量抛出 ReferenceError。

最安全、最通用的方法是用 typeof 运算符判断:typeof 变量名 === 'undefined'。它不会因变量未声明而报错,能同时覆盖“未声明”和“已声明未赋值”两种情况。
为什么不能直接用 === undefined
因为对一个根本没声明的变量执行 myVar === undefined,JavaScript 会立即抛出 ReferenceError,中断执行。只有在你**确定该变量已在当前作用域中声明过**时,才能放心用严格相等比较。
检测全局变量是否声明的其他方式
仅适用于浏览器环境下的全局变量(即挂载在 window 上的):
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
'myVar' in window—— 返回true表示已声明(无论是否赋值) -
window.hasOwnProperty('myVar')—— 同上,但不包含原型链上的属性 -
typeof window.myVar !== 'undefined'—— 先访问window.myVar,再判类型(比in多一层安全,但不如纯typeof myVar简洁)
不推荐但偶尔见到的方式
这些方法要么有风险,要么开销大,日常开发中应避免:
-
try...catch包裹访问:能捕获ReferenceError,但性能差、逻辑冗余 -
if (myVar)或!myVar:会把0、''、false等 falsy 值一并误判 -
myVar == undefined:宽松相等会让null也被当成undefined,失去类型精度
区分“未声明”和“已声明未赋值”的实际意义
多数时候你并不需要深究二者区别,只需知道:
-
typeof x === 'undefined'→ 安全,可读性强,适用所有场景 -
x === undefined→ 快速,但只适合函数参数、对象属性、或明确已let/const/var声明过的变量 -
null和undefined不同:typeof null是'object',而typeof undefined才是'undefined';判空时建议先用typeof确认存在性,再单独处理null

















