在JavaScript里,void操作符可以说是存在感最弱的一个了,这个操作符只有一个功能,就是接收任意的表达式或值,然后返回 undefined。(你没看错,就是undefined)
用法和 typeof 一样,可以在后面加上小括号()或直接加上某个值:
void 0; //undefinedvoid(0); //undefined
毫无反应,就是返回 undefined。而你可能在某些地方见过 void(0) 这样的代码,尤其是在标签的 href 属性:< a href="javascript:void(0)">...
那么这样一个神奇的 void 操作符到用是用来做什么呢?
根据 ECMAScript 262的规范中提到:
The void Operator
The production UnaryExpression : void UnaryExpression is evaluated as follows:
Let expr be the result of evaluating UnaryExpression.
Call GetValue(expr).
Return undefined.
NOTE: GetValue must be called even though its value is not used because it may have observable side-effects.
无论 void 后面的值是什么,它都会返回 undefined 的结果,但是有个需要特别注意的地方,这个 void 后面接的表达式是会被执行的(有没有加上括号无所谓)
// console 控制台会打印出 "HI",然后返回 undefinedvoid (console.log('HI!'));
而在 href 里面加上javascript:void(0) 代表着这是一个无目标的列链接。
当然自从我们有 HTML/JS 分离的概念后,多数开发者会采用在click event里面加上e.preventDefault() 的方式来阻挡缺省事件。
但是早期(指IE9 以前)浏览器的事件绑定就至少有W3C DOM标准的 element.addEventListener 与IE独有 element.attachEvent 要处理,在过去,与其要自己特别处理不同事件的阻挡,还不如直接下 ... 来得快速,而且还可以再 οnclick="..." 来处理后续对应的行为。
不过此时此刻多数浏览器已遵循 DOM 标准,现在不太需要这样处理了,只是我们多少还会看到 href="javascript: void(0)" 这样的做法。
另外,要是 void 后面再加上一个IIFE,即使这个function是有名字的:
void function saySomething (msg) {console.log(msg);
} ('Hello');
因为 void 后面的指令是会执行的,所以此时console 会直接打印出 "Hello"。
要是想再尝试去调用 saySomething 这个函数:
// console.log 会立即打印出 "Hello"void function saySomething (msg) {console.log(msg);
} ('Hello');// 则会出现 Uncaught ReferenceError: saySomething is not defined 的错误信息saySomething('Hi');
像这样,虽然 void 的使用情境不多,但是有些开发者会习惯在此类一次调用的IIFE前面加上 void 来增加代码的可读性。
最后再分享一个有趣的事,如果你曾经使用过LiveScript开发,你可能会看过编译出来的 JavaScript 程序有很多 void 8,像这样:
x = if truthy then success!
上面这段代码编译后会得到
var x;x = truthy ? success() : void 8;
根据前面的说明我们都知道 void 8最后会得到 undefined 的结果,而这个 void 8 有没有特别用意呢?其实没有,根据LiveScript 的核心成员 coco的解释:
void 8 - the number 8 was chosen because it is a Chinese lucky number.
使用8单纯只是它在中文代表是个幸运的数字(音近似发),换成其他数字都可以,重点只是取它返回 undefined 这样的作用。