void 0是什么鬼?和undefined啥区别

184 阅读1分钟

经常可以在一些代码中看到void 0的写法,比如redux

image.png 这是什么神仙操作?还有这种语法? 实际还真有,MDN的说法是这样

void运算符对给定的表达式进行求值,然后返回 undefined。

这个运算符能向期望一个表达式的值是undefined的地方插入会产生副作用的表达式。

从这里我们可以得知void是个运算符,并且始终返回undefined,所以void 0就是undefined,那么为什么不直接使用更语义化的undefined呢?void 0有啥优秀的地方呢?

1. void 0可用于压缩代码。

源代码里是不常见void 0的,见的地方一般是压缩混淆的代码,比如uglify蹂躏后的:

image.png 看到了吧,void 0是6个字符,undefined需要9个,虽然对于一个库来说微乎其微,但uglify确实是"无所不用其极"了,👍🏻。

2. void 0可用于防止undefined被篡改

啥,undefined还能被篡改?我们再来看MDN对于undefined的描述:

undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量。undefined的最初值就是原始数据类型undefined

注意undefined是全局对象的一个属性,当然属性就可以被修改,虽然es5已经规定undefined不能被修改了,但可能有些浏览器不是这样实现。另外由于undefined不是一个保留字,所以可以用作变量,比如这样:

image.pngvoid 0可以避免这种情况。

不过这两个情况我们基本不会碰到,知道就好,还是好好使用语义化的undefined,不然会被打的哦😜。