undefined

全局属性 undefined 表示原始值 undefined。它是 JavaScript 的 基本类型 之一。

试试看

原始值 undefined

undefined 的属性属性
可写
可枚举
可配置

描述

undefined全局对象的属性。也就是说,它是全局范围内的变量。

在所有非遗留浏览器中,undefined 是一个不可配置、不可写的属性。即使不是这种情况,也要避免覆盖它。

未分配值的变量类型为 undefined。如果正在评估的变量没有分配值,方法或语句也会返回 undefined。如果函数没有返回值,则函数返回 undefined

注意: 虽然你可以在除全局范围之外的任何范围内使用 undefined 作为 标识符(变量名称)(因为 undefined 不是 保留字),但这样做是一个非常糟糕的做法,会使你的代码难以维护和调试。

js
// DON'T DO THIS

(() => {
  const undefined = "foo";
  console.log(undefined, typeof undefined); // foo string
})();

((undefined) => {
  console.log(undefined, typeof undefined); // foo string
})("foo");

示例

严格相等和 undefined

你可以使用 undefined 和严格相等和不相等运算符来确定变量是否具有值。在下面的代码中,变量 x 未初始化,if 语句评估为 true。

js
let x;
if (x === undefined) {
  // these statements execute
} else {
  // these statements do not execute
}

注意: 此处必须使用严格相等运算符(与标准相等运算符相反),因为 x == undefined 还检查 x 是否为 null,而严格相等则不检查。这是因为 null 不等效于 undefined

有关详细信息,请参阅 相等比较和相同性

typeof 运算符和 undefined

或者,可以使用 typeof

js
let x;
if (typeof x === "undefined") {
  // these statements execute
}

使用 typeof 的一个原因是,如果变量未声明,它不会引发错误。

js
// x has not been declared before
// evaluates to true without errors
if (typeof x === "undefined") {
  // these statements execute
}

// Throws a ReferenceError
if (x === undefined) {
}

但是,还有另一种选择。JavaScript 是一种静态作用域语言,因此可以通过查看变量是否在封闭上下文中声明来确定它是否已声明。

全局范围绑定到 全局对象,因此可以通过使用 in 运算符检查全局对象上是否存在属性来检查变量在全局上下文中的存在性,例如

js
if ("x" in window) {
  // These statements execute only if x is defined globally
}

void 运算符和 undefined

void 运算符是第三种选择。

js
let x;
if (x === void 0) {
  // these statements execute
}

// y has not been declared before
if (y === void 0) {
  // throws Uncaught ReferenceError: y is not defined
}

规范

规范
ECMAScript 语言规范
# sec-undefined

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅