ECMAScript中原始類型Null和Undefined小結

文章最新版地址:http://leeyee.github.io/blog/2013/05/07/javascript-null-undefined


  var param; var param = undefined; var param = null; 未定義
param == 'undefined' false false  false 報錯。param未定義
param === 'undefined' false   false   false   報錯。param未定義
param == undefined true true true 報錯。param未定義
param === undefined true  true  false 報錯。param未定義
typeof param undefined   undefined  object undefined 
typeof param == 'undefined' true  true  false  true 
typeof param === 'undefined' true  true false  true 
typeof param == undefined false  false  false  false 
typeof param === undefined false false  false  false
if(param) false  false  false  報錯。param未定義 
if(typeof param) true true true  true  


結論:

  • null 表示無值,而 undefined 表示一個未聲明的變量,或已聲明但沒有賦值的變量,或一個並不存在的對象屬性。
  • 聲明但不賦值,默認爲undefined;即 var param ; 等價於 var param = undefined;
  • undefined不同於未定義,但typeof並不區分undefined和未定義;因此typeof(undefined)與typeof(未定義變量)的輸出值都是undefined;
  • 當函數無明確返回值時,默認返回的爲undefined;如:( function foo(){ })
  • typeof(null)返回的是對象,但null == undefined返回true;這是由於值undefined其實是從值null派生過來的,因此ECMAScript將其定義爲一樣的;
  • null 雖然 == undefined,但undefined是聲明瞭變量但未對其初始化時賦值時賦予該變量的值,null則表示尚未存在的對象;
  • 只能用 === 運算來測試某個值是否是未定義的,因爲 == 運算符認爲 undefined 值等價於 null;
  • 函數或方法返回值爲對象時,如果該返回的對象找不到則該函數或方法通常返回的是null;
  • typeof方法返回的是變量的引用類型的字符名稱。因此if(typeof param)爲永真。如果要判斷引用類型,可以使用instanceof,但此時變量的聲明應使用new關鍵字創建。
測試代碼:


     function test1() {
          var param;// 定義但未賦值
          console.log("1. var param; --> ", "定義但未賦值");
          console.log(" 1.1. param == 'undefined' <--> ", param == 'undefined'); // false
          console.log(" 1.2. param == undefined <--> ", param == undefined);// true
         
          console.log("      1.1.1 param === 'undefined' <--> ", param === 'undefined'); // false
          console.log("      1.2.1 param === undefined <--> ", param === undefined);// true
         
          console.log(" 1.3. typeof param <--> ", typeof param); // undefined
          console.log(" 1.4. typeof param == 'undefined' <--> ",
                   typeof param == 'undefined'); //true
          console.log(" 1.5. typeof param == undefined <--> ",
                   typeof param == undefined);//false
          console.log("      1.4.1 typeof param === 'undefined' <--> ",
                   typeof param === 'undefined'); //true
          console.log("      1.5.1 typeof param === undefined <--> ",
                   typeof param === undefined);//false
          param ? console.log(" 1.6. if(param) return true") : console
                   .log(" 1.6. if(param) return false");

          typeof param ? console.log(" 1.7. if(typeof param) return true")
                   : console.log(" 1.7. if(typeof param) return false");

     }
     function test2() {
          console.log("2. param未定義");
          console.log(" 2.1. param == 'undefined' <--> ", "報錯,param未定義");
          console.log(" 2.2. param == undefined <--> ", "報錯,param未定義");
          console.log(" 2.3. typeof param <--> ", typeof param); // undefined
          console.log(" 2.4. typeof param == 'undefined' <--> ",
                   typeof param == "undefined");//true
          console.log(" 2.5. typeof param == undefined <--> ",
                   typeof param == undefined);//false
                         console.log("      2.4.1 typeof param === 'undefined' <--> ",
                   typeof param === 'undefined');//true
          console.log("      2.5.1 typeof param === undefined <--> ",
                   typeof param === undefined);//false

          console.log(" 2.6. if(param) 由於param未定義,因此報錯");
          typeof param ? console.log(" 2.7. if(typeof param) return true")
                   : console.log(" 2.8. if(typeof param) return false");

     }
     function test3() {
          var param = null;
          console.log("3. var param = null;   -->", "定義默認爲null");
          console.log(" 3.1. param == 'undefined' <--> ", param == 'undefined'); // false
          console.log(" 3.2. param == undefined <--> ", param == undefined);// true
         
          console.log("      3.1.1 param === 'undefined' <--> ", param === 'undefined'); // false
          console.log("      3.2.1 param === undefined <--> ", param === undefined);// true
         
          console.log(" 3.3. typeof param <--> ", typeof param); // object
          console.log(" 3.4. typeof param == 'undefined' <--> ",
                   typeof param == 'undefined'); //false
          console.log(" 3.5. typeof param == undefined <--> ",
                   typeof param == undefined);//false
         
           console.log("      3.4.1 typeof param === 'undefined' <--> ",
                   typeof param === 'undefined'); //false
          console.log("      3.5.1 typeof param === undefined <--> ",
                   typeof param === undefined);//false
         
          param ? console.log(" 3.6. if(param) return true") : console
                   .log(" 3.6. if(param) return false");

          typeof param ? console.log(" 3.7. if(typeof param) return true")
                   : console.log(" 3.7. if(typeof param) return false");

     }
     function test4() {
          var param = undefined;
          console.log("4. var param = undefined;   -->", "定義默認爲undefined");
          console.log(" 4.1. param == 'undefined' <--> ", param == 'undefined'); // false
          console.log(" 4.2. param == undefined <--> ", param == undefined);// true
          console.log(" 4.3. typeof param <--> ", typeof param); // undefined
          console.log(" 4.4. typeof param == 'undefined' <--> ",
                   typeof param == 'undefined'); //true
          console.log(" 4.5. typeof param == undefined <--> ",
                   typeof param == undefined);//false
          param ? console.log(" 4.6. if(param) return true") : console
                   .log(" 4.6. if(param) return false");

          typeof param ? console.log(" 4.7. if(typeof param) return true")
                   : console.log(" 4.7. if(typeof param) return false");
     }
     test1();
     test2();
     test3();
     test4();


測試結果:


1. var param; --> 定義但未賦值
  1.1. param == 'undefined' <--> false
  1.2. param == undefined <--> true
       1.1.1 param === 'undefined' <--> false
       1.2.1 param === undefined <--> true
  1.3. typeof param <--> undefined
  1.4. typeof param == 'undefined' <--> true
  1.5. typeof param == undefined <--> false
       1.4.1 typeof param === 'undefined' <--> true
       1.5.1 typeof param === undefined <--> false
  1.6. if(param) return false
  1.7. if(typeof param) return true
2. param未定義
  2.1. param == 'undefined' <--> 報錯,param未定義
  2.2. param == undefined <--> 報錯,param未定義
  2.3. typeof param <--> undefined
  2.4. typeof param == 'undefined' <--> true
  2.5. typeof param == undefined <--> false
       2.4.1 typeof param === 'undefined' <--> true
       2.5.1 typeof param === undefined <--> false
  2.6. if(param) 由於param未定義,因此報錯
  2.7. if(typeof param) return true
3. var param = null;   -->定義默認爲null
  3.1. param == 'undefined' <--> false
  3.2. param == undefined <--> true
       3.1.1 param === 'undefined' <--> false
       3.2.1 param === undefined <--> false
  3.3. typeof param <--> object
  3.4. typeof param == 'undefined' <--> false
  3.5. typeof param == undefined <--> false
       3.4.1 typeof param === 'undefined' <--> false
       3.5.1 typeof param === undefined <--> false
  3.6. if(param) return false
  3.7. if(typeof param) return true
4. var param = undefined;   -->定義默認爲undefined
  4.1. param == 'undefined' <--> false
  4.2. param == undefined <--> true
  4.3. typeof param <--> undefined
  4.4. typeof param == 'undefined' <--> true
  4.5. typeof param == undefined <--> false
  4.6. if(param) return false
  4.7. if(typeof param) return true 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章