标准答案

  1. undefined:通常表示“没有得到值”。变量声明了但没有赋值、函数没有 return、形参没有传入、对象属性读取不到时都会得到 undefined。
  2. null:通常表示开发者主动赋予的“空值”,表达这里有这个字段或位置,但当前没有对象或没有结果。
  3. 未声明变量:表示当前作用域链里根本没有这个绑定。直接读取未声明变量会抛 ReferenceError;如果只是判断一个全局变量是否存在,可以用 typeof unknownName === "undefined" 这种安全写法。
  4. 业务判断:如果只想判断 null 或 undefined,可以用 value == null。需要区分时分别用 value === null 和 value === undefined。判断对象属性是否存在时,不要只看 obj[key] 是否等于 undefined,应该用 Object.hasOwn(obj, key)、in 或 hasOwnProperty。

题目解析

这里关注的是语义,而不是 API 数量。undefined 更偏“缺省、未产生、未传入”,null 更偏“明确为空”。接口字段、表单状态和后端返回值最好统一空值约定,否则前端判断会变得混乱。

判断属性存在和值是否为空是两件事。obj.name === undefined 不能证明 name 不存在,只能说明读取结果是 undefined。

代码示例

实际项目里常见的是空值判断和属性存在性判断,两者要分开写。

JavaScript
function isNil(value) {
  return value == null
}

const user = { name: undefined }

user.name === undefined // true
Object.hasOwn(user, 'name') // true

typeof notDeclared === 'undefined' // true,不会抛错
// notDeclared === undefined // ReferenceError

常见误区

  • 把 null 和 undefined 完全混用,导致业务语义不清楚。
  • 用 if (value) 判断空值,误伤 0、false、空字符串。
  • 直接访问可能未声明的变量,而不是通过 typeof 做安全判断。

作者信息