恩,这是个题目。假如你有印象,void
以至是js中的26个关键字之一,依据ECMA官方规范,它是一个一元操作符,它的唯一作用就是返回一个undefined
,不论这个操作符背面传的操作数是什么。
在规范里对void
的实行细节是这么说的:
- Let expr be the result of evaluating UnaryExpression.–》把表达式的值赋给expr;
- Call GetValue(expr).–》挪用expr的内部函数猎取它的值;
- Return undefined. –》返回undefined
这有点像谁人很有意义的笑话:
客长你吃啥?
啊,我要一碗牛肉面,面给我多煮会少放点葱多放点辣肉给我放多一点汤给我多盛点。
哦,一碗牛肉面。
void
能够像下面如许运用:
javascript
void 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
,结果与上述代码一致。
javascript
void function fn(){ console.log("I will show immediately.") }()
那末题目是,为何不直接运用undefined
这个值的字面量情势呢?
我在stackoverflow上找到一个诠释:
由于undefined
既不是保留字,也不是关键字,它能够作为变量标识符赋值,所以你手写出来的undefined
是有能够被掩盖的!比方:
javascript
var undefined="oops"; alert(undefined);
上述代码在一些原始社会的浏览器中会胜利弹出oops
,说到原始社会的浏览器,我们来尝尝IE吧。经由测试,这段代码在IE9以下的浏览器中真的会弹出oops
! oops! 你也能够尝尝。
不过,在当代浏览器中,已不能这么做了,依然能够给undefined
赋值,但这个是无效的。尝尝跟undefined
很相似的null
,给它赋值就会报错。
所以,当我们要取得真正的undefined
值的时刻,用void
操作符吧。void
背面能够是任何操作数(注重:假如背面没有操作数也会报错的),那运用时用什么呢?良知引荐照样写void 0
吧,毕竟这是最简短的。
关于数组中的undefined
,另有一些很新鲜的处所,比方,怎样辨别下面这两个数组中的各项是否是雷同:
javascript
var arr1=[1,2,undefined,4]; var arr2=[1,2,,4]; arr1[2]===arr2[2]; //true
下次再说。