如何在JavaScript中直接写入undefined原始值而非引用全局属性?
关于直接使用JavaScript原始
undefined值的问题 首先明确核心结论:可以直接使用原始的undefined值,无需依赖全局undefined属性。下面是具体的实现方式和相关细节:
直接获取原始undefined的几种方式
- 未赋值变量的默认值:声明变量但不初始化时,变量会被自动赋予原始
undefined值,这个值和全局undefined属性无关。比如:let unassigned; console.log(unassigned === void 0); // true,说明是同一个原始值 void操作符:void操作符的作用是对任意表达式求值后,直接返回原始undefined值,完全不依赖全局环境的undefined属性。这也是业界常用的规避全局undefined被篡改风险的写法:const rawUndefined = void 0; // 即使全局undefined被篡改(旧环境非严格模式下可能发生),rawUndefined依然是原始值- 无返回值函数的返回结果:没有显式
return语句的函数,调用后会返回原始undefined:function noReturn() {} console.log(noReturn() === void 0); // true - 解构赋值中的缺失项:当解构数组/对象时,对应位置没有值的变量会被赋予原始
undefined:const [missingArrItem] = []; const { missingObjProp } = {}; console.log(missingArrItem === missingObjProp); // true,都是原始undefined
关于全局undefined属性的补充说明
- 你实验中发现的
delete undefined行为差异,本质是因为全局undefined是一个不可写、不可配置的属性:- 非严格模式下,
delete undefined返回false,因为该属性无法被删除;如果写成delete window.undefined(浏览器环境),同样会返回false。 - 严格模式下,
delete操作符不允许直接删除标识符(比如undefined这种变量名),因此会抛出SyntaxError。
- 非严格模式下,
- 现在的ES规范中,全局
undefined属性已经被锁定,无法被重新赋值(严格模式下赋值会报错,非严格模式下赋值无效),但即使在旧环境中它被篡改,你依然可以通过上面的方式获取原始的undefined值。
总结
你完全可以像使用true、false那样直接使用原始undefined值,void 0是最直接且安全的写法,不需要依赖全局的undefined属性引用。
内容的提问来源于stack exchange,提问作者mishar
相关产品推荐
相关产品推荐

