void 0 是获取真正、不可篡改的 undefined 值最简洁安全的方式,因其作为一元操作符恒返回语言规范定义的原始 undefined,不依赖全局变量、不受作用域污染、无副作用且跨环境一致。
在 JavaScript 中,undefined 不是一个保留字,而是一个**可被重新赋值的全局变量**(在非严格模式下)。这意味着如果有人写了 undefined = "hacked",后续对 undefined 的直接引用就不再代表原始的“未定义”语义——这会破坏依赖 === undefined 的判断逻辑。而 void 0 是获取真正、不可篡改的 undefined 值最简洁、最安全的方式。
void 是一个一元操作符,它会执行其后的表达式(这里是 0),然后**无条件返回 undefined**,且这个 undefined 是语言规范定义的原始值,与任何变量无关。它不依赖全局对象、不访问属性、不触发 getter,也不受作用域污染影响。
void 后面可以跟任意表达式(如 void 1、void {}),结果恒为 undefined
void 0 是最短、最常见、最无副作用的选择(计算 0 几乎零开销)你可能见过其他“防篡改”写法,但它们各有局限:
void 0:✅ 安全、简短、无副作用、跨环境typeof x === "undefined":✅ 安全,但只能用于检测,不能生成 undefined 值本身window.undefined(浏览器)或 globalThis.undefined:⚠️ 在非严格模式下仍可能被覆盖;globalThis 更好但需 ES2020 支持[][0] 或 {}.a:⚠️ 依赖对象属性缺失,看似返回 undefined,但本质是读取失败的结果,不是语言层面的原始 undefined;且有潜在性能/可读性问题当你需要显式返回、赋值或比较真正的 undefined 时,优先用 void 0:
return condition ? value : void 0;
undefined:let data = void 0;
const isUndefined = (x) => x === void 0;(比 === undefined 更鲁棒)export default void 0;
在 "use strict" 下,对 undefined 赋值会直接抛出 TypeError,因此现代代码中全局污染概率极低。但 void 0 仍是更底层、更确定的方案——它不依赖执行上下文是否严格,也不假设运行环境是否“干净”,属于防御性编程的轻量实践。