void关键字有个毛用?

恩,这是个题目。假如你有印象,void以至是js中的26个关键字之一,依据ECMA官方规范,它是一个一元操作符,它的唯一作用就是返回一个undefined,不论这个操作符背面传的操作数是什么。
在规范里对void的实行细节是这么说的:

  1. Let expr be the result of evaluating UnaryExpression.–》把表达式的值赋给expr;
  2. Call GetValue(expr).–》挪用expr的内部函数猎取它的值;
  3. Return undefined. –》返回undefined

这有点像谁人很有意义的笑话:

客长你吃啥?
啊,我要一碗牛肉面,面给我多煮会少放点葱多放点辣肉给我放多一点汤给我多盛点。
哦,一碗牛肉面。

void能够像下面如许运用:

javascriptvoid 0;
void "you are useless?";
void false;
void [];
void /(useless)/ig;
void function(){ console.log("you are so useless?"); }
//... always return undefined

背面能够是任何表达式,返回的永远是undefined!很明显,在你想取得undefined的时刻,能够用这个操作符。一般有以下运用场景:

一、Javascript URIs

html<a href="javascript:void(0);">
  Click here to do nothing
</a>

<a href="javascript:void(document.body.style.backgroundColor='green');">
  Click here for green background
</a>

这是MDN文档中给出的例子,我之前看到不少远古时代的网页运用如许的写法,就是直接在a标签的href属性里写js代码,比方<a href="javascript:;">link</a>,如许写跟<a href="#">link</a>的区别是后者在点击的时刻页面会跳到最顶部去,假如这不是你要的结果肯定要注重;在href里写javascript:void(0);则能够防止上述题目。

不过如今如许写javascript:是不首倡的。

二、用于闭包防止剖析毛病

你们肯定已看到过闭包的这类写法:

javascript!function fn(){
  console.log("I will show immediately.")
}()

上述这段代码中的!能够换成其他操作符,比方+-~,加上这些前缀的作用是防止js剖析器讲函数体剖析为函数声明。

剖析器在碰到代码function fn(){ /*...*/}时会把这剖析成函数声明,在函数声明背面再随着一对括号会发生语法毛病,前面加上一个操作符,剖析器就会把这段代码当做函数表达式,从而能够顺遂实行。

在前面这个场景中,这个操作符也能够用void,结果与上述代码一致。

javascriptvoid function fn(){
  console.log("I will show immediately.")
}()

那末题目是,为何不直接运用undefined这个值的字面量情势呢?
我在stackoverflow上找到一个诠释:
由于undefined既不是保留字,也不是关键字,它能够作为变量标识符赋值,所以你手写出来的undefined有能够被掩盖的!比方:

javascriptvar undefined="oops";
alert(undefined);

上述代码在一些原始社会的浏览器中会胜利弹出oops,说到原始社会的浏览器,我们来尝尝IE吧。经由测试,这段代码在IE9以下的浏览器中真的会弹出oops! oops! 你也能够尝尝。
不过,在当代浏览器中,已不能这么做了,依然能够给undefined赋值,但这个是无效的。尝尝跟undefined很相似的null,给它赋值就会报错。

所以,当我们要取得真正的undefined值的时刻,用void操作符吧。void背面能够是任何操作数(注重:假如背面没有操作数也会报错的),那运用时用什么呢?良知引荐照样写void 0吧,毕竟这是最简短的。

关于数组中的undefined,另有一些很新鲜的处所,比方,怎样辨别下面这两个数组中的各项是否是雷同:

javascriptvar arr1=[1,2,undefined,4];
var arr2=[1,2,,4];
arr1[2]===arr2[2]; //true

下次再说。

    原文作者:oslh
    原文地址: https://segmentfault.com/a/1190000002965297
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞