天天看點

JS魔法堂:從void 0 === undefined說起

一、前言                                    

  當使用coffeescript書寫如下代碼時 name = person?.name 會被預編譯為 var name = typeof person !== "undefined" && person !== null ? person.name : void 0; ,那麼void 0到底是什麼意思呢?運作得知void 0===undefined為true。那為什麼不直接使用undefined而要使用void 0呢?而一進制運算符void具體又有什麼作用呢?下面将展開來說明。

二、為什麼不直接用undefined                          

  undefined在javascript中并不屬于保留字/關鍵字,是以在ie5.5~8中我們可以将其當作變量那樣對其指派(ie9+及其他現代浏覽器中指派給undefined将無效)

  于是采用void方式擷取undefined則成了通用準則。

三、一進制運算符void的作用                         

  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的行為特點為:

  1. 不管void後的運算數是什麼,隻管傳回純正的undefined;

  2. void會對其後的運算數作取值操作,是以若屬性有個getter函數,那麼就會調用getter函數(是以會産生副作用)

   通過一進制運算符 delete 作對比,delete的其中一個行為特點是不對其運算數進行取值操作(delete的其他行為特點比我們想的複雜得多,這裡就不詳細記錄了)

四、還有啥方式可以得到純正的undefined?                

  除了通過一進制運算符void擷取純正的undefined,其實我們還有如下方法來擷取:

  1. 未指派的變量

  2. 未指派的實參(和未指派的變量同理)

  3. 無傳回值函數

  4. 未定義的屬性

五、總結                              

  一個小小的void和undefined就這麼好玩,前端的世界還有很多事情要深入研究哦!!

繼續閱讀