在看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
一定要调用做出了详细的解释。
网友评论