typeof可安全判断变量是否声明(不报错),但无法区分未声明与已声明未赋值;判断是否定义需用严格比较、空值合并或存在性检查。

在 JavaScript 中,“是否被声明”和“是否被定义”是两个不同层面的问题,需要分开判断。简单说:用 typeof 判断是否声明(不报错),用严格比较或存在性检查判断是否真正有值(即是否定义并赋值)。
一、判断变量是否已被声明(避免 ReferenceError)
未声明的变量直接访问会抛出 ReferenceError,所以不能用 varName === undefined 这类方式。安全的方法是:
- 使用
typeof操作符:它对未声明变量返回字符串"undefined",且不会报错。 - 注意:
typeof对已声明但未赋值的变量也返回"undefined",所以它只能告诉你“没报错”,不能区分“未声明”和“声明了但没赋值”。
示例:
console.log(typeof undeclaredVar); // "undefined"(安全) console.log(undeclaredVar); // ReferenceError! let declaredButNotAssigned; console.log(typeof declaredButNotAssigned); // "undefined"
二、判断变量是否已被定义(即是否有有效值)
“已定义”通常指变量存在且被赋予了非 undefined、非 null 的有意义值(具体取决于业务逻辑)。常见做法:
-
variable !== undefined:确认不是undefined(适用于已声明变量) -
variable != null:同时排除null和undefined(宽松相等) -
variable !== undefined && variable !== null:更严谨的双排除 -
variable ?? 'default':空值合并操作符,适合提供默认值
⚠️ 注意:if (variable) 会触发“真值判断”,会把 0、''、false 等也当成“未定义”,慎用。
三、结合场景的实用判断方式
根据变量作用域和使用上下文选择合适方法:
- 全局变量(如挂载在
window上):可用'propName' in window或window.hasOwnProperty('propName')判断是否声明 - 函数参数:用
arguments.length > 0或直接param !== undefined(ES6 后推荐用默认参数) - 对象属性:优先用
obj?.prop !== undefined(可选链 + 严格比较)或Object.hasOwn(obj, 'prop')(推荐替代hasOwnProperty)
四、ES6+ 更清晰的写法建议
现代 JS 推荐从源头减少歧义:
- 用
let/const替代var,避免变量提升带来的混淆 - 函数参数设默认值:
function fn(val = 'default') { ... } - 解构赋值时设默认值:
const { name = 'anonymous' } = obj; - 用 TypeScript 更早发现未声明/未定义问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











