Undefined 是合法原始值,变量声明未赋值时即为此值;undeclared 则是语法错误,变量根本未声明,直接访问抛 ReferenceError。

Undefined 和 undeclared 不是同一种状态,也不是同一个层级的概念:前者是值,后者是语法错误或作用域缺失。
undefined 是一个合法的原始值
变量已声明但未赋值时,它的值就是 undefined。它属于 JavaScript 的六种基本类型之一,可以被安全读取、比较、甚至显式赋值。
-
let x;→x的值是undefined -
const y = undefined;→ 合法,y的值明确为undefined -
console.log(obj.missingProp);→ 对象不存在的属性也返回undefined - 访问它不会报错,只是值为空
undeclared 表示变量根本不存在
代码里压根没用 var、let 或 const 声明过这个标识符,直接使用就会触发 ReferenceError(引用错误)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
console.log(z);→ 报错:ReferenceError: z is not defined - 在严格模式下,连
z = 10都会报错 - 非严格模式下给 undeclared 变量赋值,会意外创建全局变量(如挂到
window.z),这是隐患,不是特性
检测方式完全不同
不能用 == 或 === 直接判断 undeclared 变量——还没走到比较那步就崩了。唯一安全的方式是借助 typeof:
立即学习“Java免费学习笔记(深入)”;
-
typeof unknownVar === 'undefined'→ 返回true,说明该变量要么是undefined,要么是 undeclared(两者都安全) - 但无法单靠
typeof区分二者;若需进一步确认是否真的声明过,可查作用域链或用hasOwnProperty(针对对象属性) - 避免写
if (x === undefined),应写if (typeof x === 'undefined')或更推荐if (x == null)(兼顾null和undefined)
实际开发中怎么规避
核心原则是:声明先行、作用域清晰、工具辅助。
- 始终用
let/const显式声明变量,不依赖变量提升 - 启用
'use strict';,让 undeclared 赋值立即报错,而不是偷偷污染全局 - 用 ESLint 开启
no-undef规则,提前拦截 undeclared 引用 - 函数参数、解构赋值、可选链(
?.)等现代语法,也能减少对裸变量的直接依赖

















