JS魔法堂:從void 0 === undefined提及

1、前言                                    html

  當使用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具體又有什麼做用呢?下面將展開來講明。前端

 

2、爲何不直接用undefined                          segmentfault

  undefined在JavaScript中並不屬於保留字/關鍵字,所以在IE5.5~8中咱們能夠將其看成變量那樣對其賦值(IE9+及其餘現代瀏覽器中賦值給undefined將無效)瀏覽器

var undefinedBackup = undefined;
undefined = 1;
// 顯示"undefined"
console.log(typeof undefinedBackup);  
// 在IE5.5~8中顯示"number",其餘瀏覽器中則顯示"undefined"
console.log(typeof undefined);

  因而採用void方式獲取undefined則成了通用準則。ide

 

3、一元運算符void的做用                         函數

  void在ECMAScript 262規範以下:this

The void Operatorlua

The production UnaryExpression : void UnaryExpression is evaluated as follows:spa

  • 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.code

   void的行爲特色爲:

  1. 無論void後的運算數是什麼,只管返回純正的undefined;

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

var article = {
    _view: 0,
    get view(){
        console.log(this._view);
    return this._view++;
    }
};
var test = void article.view; // 顯示0
console.log(test); // 顯示undefined
console.log(article._view); // 顯示1

   經過一元運算符 delete 做對比,delete的其中一個行爲特色是不對其運算數進行取值操做(delete的其餘行爲特色比咱們想的複雜得多,這裏就不詳細記錄了)

var article = {
    _view: 0,
    get view(){
    console.log(this._view);
    return this._view++;
    }
};
var ret = delete article.view;
console.log(ret); // 顯示true
console.log(article._view); // 顯示0

 

4、還有啥方式能夠獲得純正的undefined?                

  除了經過一元運算符void獲取純正的undefined,其實咱們還有以下方法來獲取:

  1. 未賦值的變量

var myUndefined;
console.log(typeof myUndefined); // 顯示"undefined"

  2. 未賦值的實參(和未賦值的變量同理)

var getUndefined = function(undefined){
  return undefined;
};
var myUndefined = getUndefined();
// 或經過arguments獲取
var getUndefined = function(){
  return arguments[arguments.length];
};

  3. 無返回值函數

var getUndefined = function(){};
var myUndefined = getUndefined();

  4. 未定義的屬性

var myUndefined1 = {}[''];
var myUndefined2 = [][0];

 

5、總結                              

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

  尊重原創,轉載請註明來自:http://www.cnblogs.com/fsjohnhuang/p/4146506.html^_^肥子John

 

6、參考                              

談談Javascript中的void操做符

相關文章
相關標籤/搜索