void 0 与 undefined

在看React的react-dom.js源码的时候,发现void 0,在很多地方用到。回忆起最初使用void 0的地方,是设置a标签的href是个死链接,及配置a标签的href=javascript:void(0);的方式防止a标签本身的链接跳转。

首先先了解一下void😊

void操作符

MDN中对void的说明:

void 运算符对给定的表达式进行求值,然后返回 undefined
这个运算符能向期望一个表达式的值是undefined的地方插入会产生副作用的表达式。
void 运算符通常只用于获取 undefined的原始值,一般使用void(0)(等同于void 0)。在上述情况中,也可以使用全局变量undefined 来代替(假定其仍是默认值)。

产生式 UnaryExpression : void UnaryExpression 按如下流程解释:

  • expr 为解释执行UnaryExpression的结果。
  • 调用 GetValue(expr)。(后面会有解释
  • 返回 undefined。

注意:GetValue一定要调用,即使它的值不会被用到,但是这个表达式可能会有副作用(side-effects)。
重点在于:无论void后的表达式是什么,void操作符都会返回undefined。

为什么要用void?

因为undefined在javascript中不是保留字。换言之,undefined可以被重写。
undefined 在 ES5 中已经是全局对象的一个只读(read-only)属性了,它不能被重写。但是在局部作用域中,还是可以被重写的。

function testFunc() {
    var undefined = "hello world";
    console.log(undefined); //会输出"hello world"
}
testFunc();
console.log(undefined); //输出undefined

void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void 后面你随便跟上一个表达式,返回的都是 undefined,如 void (2), void (‘hello’)。并且void是不能被重写的。但为什么是void 0 呢,void 0 是表达式中最短的。用 void 0 代替 undefined 能节省字节。不少 JavaScript 压缩工具在压缩过程中,正是将 undefined 用 void 0 代替掉了。

总结

  • 通过采用void 0取undefined比采用字面上的undefined更靠谱更安全,应该优先采用void 0这种方式。
  • 填充<a>的href确保点击时不会产生页面跳转; 填充<image>src,确保不会向服务器发出垃圾请求。
    备注:
    参考文章:谈谈Javascript中的void操作符------里面对GetValue一定要调用做出了详细的解释。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,281评论 0 3
  • 运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,本章逐一介绍这些运算...
    徵羽kid阅读 699评论 0 0
  • 标签: 我的笔记 ---学习资料:http://javascript.ruanyifeng.com/ 1. 导论 ...
    暗夜的怒吼阅读 836评论 0 1
  • JavaScript语言精粹 前言 约定:=> 表示参考相关文章或书籍; JS是JavaScript的缩写。 本书...
    微笑的AK47阅读 587评论 0 3
  • 2019年1月30日 执行人:张玮琦 指导老师:李娜 今天早上我5:00就起来了,因为我前几天我没有回去老家,所以...
    最开心的人阅读 133评论 0 2