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)