标准答案
- undefined:通常表示“没有得到值”。变量声明了但没有赋值、函数没有 return、形参没有传入、对象属性读取不到时都会得到 undefined。
- null:通常表示开发者主动赋予的“空值”,表达这里有这个字段或位置,但当前没有对象或没有结果。
- 未声明变量:表示当前作用域链里根本没有这个绑定。直接读取未声明变量会抛 ReferenceError;如果只是判断一个全局变量是否存在,可以用 typeof unknownName === "undefined" 这种安全写法。
- 业务判断:如果只想判断 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 做安全判断。