ECMA-262定義了ECMAScript所支持的關鍵字(keyword),關鍵字不能用做ECMAScript程序的標識符(Indetifiers)。ECMA-262標準定義瞭如下關鍵字:javascript
break do instanceof typeof case else new var catch finally return void continue for switch while debugger function this with default if throw delete in try
根據ECMA-262定義,void是javascript中的26個關鍵字之一,那麼在javascript中void有什麼用,和其餘語言中的void有什麼不同呢。根據ECMA官方標準定義,void是一個一元操做符並返回undefined,不管表達式後面是什麼。html
在ECMA-262規範中有以下描述:java
void後能夠是任意表達式(UnaryExpression),返回值有且只有undefined:ide
注:不要寫成void 1 + 1等這種形式,因爲void比+優先級高,那就變成了(void 1) + 1this
依據ECMA-262規範,void運算符返回而且只返回undefined,因爲undefined在ECMA-262官方標準中既不是關鍵字也不是保留字,它能夠做爲變量名被賦值,所以undefined有可能做爲變量被覆蓋,全部使用void 0代替undefined就成了經常使用的方法。spa
function joke() { var undefined = "hello world"; console.log(undefined); //會輸出"hello world" } var property = function (key) { return function (obj) { return obj == null ? void 0 : obj[key]; }; };
能夠用javascript:void(0),來阻止連接默認的跳轉行爲,下面是MDN文檔的示例:debug
<a href="javascript:void(0);">Click here to do nothing</a>
<a href="javascript:void(alert('hello word!'))">Click me!</a>
注:不管void(UnaryExpression)延伸出多少種用法,其本質就在於執行UnaryExpression並返回undefined這一點。
設計
回到void的ECAM-262官方標準定義處,既然void的返回值永遠是undefined,那麼爲何還須要調用GetVale(expr)。其實void設計來實現執行後邊的表達式並忽略表達式結果返回undefined,若是表達式的結果是一個Reference,並無進行取值,而取值這個過程有可能有反作用(side-effect),因此要多一個GetValue步驟。code