文章最新版地址: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