你所不知道的 void

在JavaScript里,void操作符可以说是存在感最弱的一个了,这个操作符只有一个功能,就是接收任意的表达式或值,然后返回 undefined。(你没看错,就是undefined)

 

用法和 typeof 一样,可以在后面加上小括号()或直接加上某个值:

 

void 0;  //undefined
void(0); //undefined

 

毫无反应,就是返回 undefined。而你可能在某些地方见过 void(0) 这样的代码,尤其是在<a>标签的 href 属性:< a href="javascript:void(0)">...</a>

 

那么这样一个神奇的 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",然后返回 undefined
void (console.log('HI!'));

 

而在 href 里面加上javascript:void(0) 代表着这是一个无目标的列链接。

 

当然自从我们有 HTML/JS 分离的概念后,多数开发者会采用在click event里面加上e.preventDefault() 的方式来阻挡缺省事件。

 

但是早期(指IE9 以前)浏览器的事件绑定就至少有W3C DOM标准的 element.addEventListener 与IE独有 element.attachEvent 要处理,在过去,与其要自己特别处理不同事件的阻挡,还不如直接下 <a href="javascript:void(0)">...</a> 来得快速,而且还可以再 ο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 这样的作用。

 

感兴趣的朋友可以私信哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
extern void是一个在C语言中用来声明函数的关键字。它表示该函数是在其他地方定义的,而在当前的代码文件中只是声明。这样可以在当前的代码文件中使用该函数,而不需要知道具体的实现细节。extern void的作用是为了在编译阶段能够正确地引用到函数的定义。在声明函数时,有和没有extern的效果是一样的,因此可以省略extern关键字。对于变量而言,有和没有extern是有区别的,extern关键字用来声明一个变量是在其他地方定义的。至于void关键字,它表示该函数没有返回值。因此,extern void表示声明了一个没有返回值的函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [void,extern,sizeof 关键字分析](https://blog.csdn.net/qq_36016407/article/details/54915956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [从汇编看c++中extern关键字的使用](https://download.csdn.net/download/weixin_38688403/13996724)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【014 关键字】一文彻底搞懂extern用法](https://blog.csdn.net/qq_41709234/article/details/122984203)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值