经常可以在一些代码中看到void 0
的写法,比如redux
这是什么神仙操作?还有这种语法? 实际还真有,MDN的说法是这样
void运算符对给定的表达式进行求值,然后返回 undefined。
这个运算符能向期望一个表达式的值是undefined的地方插入会产生副作用的表达式。
从这里我们可以得知void
是个运算符,并且始终返回undefined
,所以void 0
就是undefined
,那么为什么不直接使用更语义化的undefined
呢?void 0
有啥优秀的地方呢?
1. void 0
可用于压缩代码。
源代码里是不常见void 0
的,见的地方一般是压缩混淆的代码,比如uglify蹂躏后的:
看到了吧,void 0
是6个字符,undefined
需要9个,虽然对于一个库来说微乎其微,但uglify
确实是"无所不用其极"了,👍🏻。
2. void 0
可用于防止undefined
被篡改
啥,undefined
还能被篡改?我们再来看MDN对于undefined
的描述:
undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。undefined的最初值就是原始数据类型undefined。
注意undefined
是全局对象的一个属性,当然属性就可以被修改,虽然es5已经规定undefined
不能被修改了,但可能有些浏览器不是这样实现。另外由于undefined
不是一个保留字,所以可以用作变量,比如这样:
而void 0
可以避免这种情况。
不过这两个情况我们基本不会碰到,知道就好,还是好好使用语义化的undefined
,不然会被打的哦😜。