博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么有的编程规范要求用 void 0 代替 undefined
阅读量:4566 次
发布时间:2019-06-08

本文共 1246 字,大约阅读时间需要 4 分钟。

Undefined

Undefined 类型表示未定义,它的类型只有一个值,就是 undefined。

任何变量在被赋值前它的值都是 undefined,但是在 JavaScript 引擎中,undefined 是一个变量而非关键字。在旧的浏览器中,全局变量 undefined 可以被重写。

/** * IE8 浏览器 */var value;console.log(value === undefined); //true// 重写 undefinedundefined = 'hi';console.log(value === undefined); //false

从上面的例子可知,在旧的浏览器下如果 undefined 被重写为非 undefined 值,那么它就无法用来正确检测一个变量是否被赋值。

这个问题在 中被修复了,在实现了 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); //trueconsole.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);

参考

  • 极客时间《重学前端》

转载于:https://www.cnblogs.com/xiaoyucoding/p/11526013.html

你可能感兴趣的文章
scrapy管道MySQL简记
查看>>
使用 jQuery Deferred 和 Promise 创建响应式应用程序
查看>>
Bzoj1013--Jsoi2008球形空间产生器
查看>>
报文格式【定长报文】
查看>>
RDLC报表钻取空白页问题
查看>>
OS X升级到10.10之后使用pod出现问题的解决方法
查看>>
多路电梯调度的思想
查看>>
jQuery-对Select的操作
查看>>
过滤器、监听器、拦截器的区别
查看>>
为什么要进行需求分析?通常对软件系统有哪些需求?
查看>>
Oracle RAC环境下ASM磁盘组扩容
查看>>
添加web引用和添加服务引用有什么区别?
查看>>
一些模板
查看>>
jquery和dom元素相互转换
查看>>
放大的X--HDOJ-201307292012
查看>>
题目831-签到-nyoj-20140818
查看>>
百词斩-斩家秘籍
查看>>
php反射
查看>>
hdu 1018 Big Number 数学结论
查看>>
【MUI】百度地图定位功能
查看>>