你不知道的js_JS冷知识: 你所不知道的 void

在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 这样的作用。

36a53c2441f88b1d903bf71a8afb6750.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值