面试题:如何获取安全的 undefined 值?

在 JavaScript 中,undefined 是一个原始值,表示变量已声明但未赋值。然而,在非严格模式(sloppy mode)下,undefined 并不是一个保留字,可以被重新赋值,这可能导致代码出现难以预料的错误。

// ⚠️ 危险!在非严格模式下允许(不推荐)
undefined = "hacked";
console.log(someUndefinedVar); // 期望是 undefined,但可能被污染

因此,获取一个“安全”的、真正 undefined 的值非常重要。


一、安全获取 undefined 值的方法

✅ 方法 1:使用 void 0(推荐)

void 操作符会计算其后的表达式,但总是返回 undefined,无论表达式是什么。

const safeUndefined = void 0;
// 常见写法:void 0, void 1, void "anything"

if (value === void 0) {
  console.log("value is truly undefined");
}

优点

  • 最安全、最高效。
  • 不受 undefined 是否被重写的影响。
  • 在压缩后代码中通常更短(如 void 0void 0)。

✅ 方法 2:使用未定义的变量(在函数参数中)

在函数内部,未定义的形参默认值就是 undefined

(function(safeUndefined) {
  // safeUndefined 的值就是真正的 undefined
  if (value === safeUndefined) {
    // ...
  }
})(undefined); // 即使全局 undefined 被改写,传入的 undefined 仍是原始值

或者使用立即调用函数表达式(IIFE)的默认参数:

(function(global) {
  // global.undefined 可能被改写
  const undefined = void 0; // 在函数内部重新定义为安全值
})(this);

✅ 方法 3:使用 typeof 检查(用于判断,不用于获取值)

虽然不能“获取” undefined,但可以安全地判断一个变量是否为 undefined

if (typeof someVar === "undefined") {
  // 即使 someVar 未声明,也不会报错
  // 安全!因为 typeof 对未声明变量返回 "undefined"
}

注意:typeof variable === "undefined" 是检查变量是否未声明或值为 undefined 的安全方式。

✅ 方法 4:ES5+ 环境中使用全局对象(较安全)

在浏览器中,window.undefined 是只读的(在 ES5+ 中 undefined 是不可写、不可配置的)。

const safeUndefined = window.undefined; // 浏览器环境
// 或
const safeUndefined = globalThis.undefined; // 通用(ES2020)

但在 Node.js 或其他环境中,需确保 global.undefined 未被修改。


二、不推荐的方法

❌ 直接使用 undefined

if (value === undefined) { } // 如果 undefined 被重写,可能出错

❌ 使用未声明的变量

value === someUndeclaredVar // ReferenceError!会报错

三、现代开发中的最佳实践

  1. 使用严格模式:在代码顶部添加 "use strict";,在严格模式下,undefined 不能被重新赋值。
  2. 使用 void 0:在需要“安全 undefined”的地方,使用 void 0
  3. 使用 typeof 检查:判断变量是否为 undefined 时,优先使用 typeof variable === "undefined"
  4. 使用现代工具:TypeScript、ESLint 等可以帮助检测潜在问题。

总结

方法是否安全说明
void 0最安全推荐,不受 undefined 重写影响
typeof x === "undefined"✅ 安全用于判断,不会报错
globalThis.undefined✅(现代环境)ES2020 标准,通常安全
直接使用 undefined⚠️ 有风险在非严格模式下可能被污染

一句话void 0 是获取安全 undefined 值的最佳方式,因为它始终返回真正的 undefined,且性能高、兼容性好。

THE END
喜欢就支持一下吧
点赞13 分享