在看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