为什么有的编程规范要求用 void 0 代替 undefined
程序员文章站
2022-08-08 17:34:33
Undefined Undefined 类型表示未定义,它的类型只有一个值,就是 undefined。 任何变量在被赋值前它的值都是 undefined,但是在 JavaScript 引擎中,undefined 是一个变量而非关键字。在旧的浏览器中,全局变量 undefined 可以被重写。 从上面 ......
undefined
undefined 类型表示未定义,它的类型只有一个值,就是 undefined。
任何变量在被赋值前它的值都是 undefined,但是在 javascript 引擎中,undefined 是一个变量而非关键字。在旧的浏览器中,全局变量 undefined 可以被重写。
/** * ie8 浏览器 */ var value; console.log(value === undefined); //true // 重写 undefined undefined = 'hi'; console.log(value === undefined); //false
从上面的例子可知,在旧的浏览器下如果 undefined 被重写为非 undefined 值,那么它就无法用来正确检测一个变量是否被赋值。
这个问题在 ecmascript 5 中被修复了,在实现了 ecmascript 5 规范的浏览器中运行以下代码。
/** * chrome 浏览器 */ object.getownpropertydescriptor(window, undefined); //运行结果:{"writable":false,"enumerable":false,"configurable":false}
从上面的运行结果可知,全局变量 undefined 的 writable 属性是 false,也就是不可写。
void
void 运算符对给定的表达式进行求值,会忽略计算结果并始终返回 undefined。
var value1 = 'hi'; console.log(value1); //"hi" var value2 = void 'hi'; console.log(value2); //undefined
因此,我们可以利用这一点准确地获取预期的 undefined 值。
var value; console.log(value === void 0); //true console.log(value === void(0)); //true
结束
从上面的测试结果来看,有的编程规范要求使用 void 0
代替 undefined,主要原因在于避免 undefined 值被重写带来的风险。现代浏览器中,全局变量 undefined 是不可写的,如果不考虑兼容旧的浏览器,那么这个问题就不用太过在意。
扩展
许多 javascript 压缩工具,已经帮助我们针对 undefined 的这个问题做出了处理。
/** * 源码 */ var value; console.log(value === undefined);
/** * 使用 uglify 压缩 */ "use strict";var value;console.log(void 0===value);
参考
- 《javascript 权威指南》
- 极客时间《重学前端》
- https://developer.mozilla.org/zh-cn/docs/web/javascript/reference/operators/void
上一篇: 微信小程序集成腾讯云 IM SDK
下一篇: 怎样炒河粉好吃又简单,小编手把手来教你