var var1; console.log( typeof var0);//print "undefined",主要看下面對var0單獨的輸出 console.log( typeof var1);//print "undefined" console.log( typeof true);//print "boolean" console.log( typeof false);//print "boolean" console.log( typeof 1);//print "number" console.log( typeof "string");//print "string" console.log( typeof (new Object()));//print "object" console.log( typeof null);//print "object" console.log( typeof NaN);//print "number" console.log( typeof undefined);//print "undefined" //console.log(var0);//Uncaught ReferenceError: var0 is not defined 瀏覽器直接報錯.且終止程序.由於var0從未聲明過.並且更未賦值.可是能夠參與typeof運算.程序不會終止.console.log(var1);//undefined,不是is not defined.也即便說已經聲明.可是未賦值.這樣就是undefined. console.log(true);//print "true" console.log(false);//print "false" console.log(1);//print "1" console.log("string");//print "string" console.log((new Object()));//print "object" console.log(null);//print "null";null 表示不存在. console.log(NaN);//print "NaN" ;是number類型裏面的概念.當兩個數字運算結果竟然不是數字了.即非數字not a number.NaN.好比0/0.這個是沒有意義的.因此是NaN console.log(undefined);//print "undefined" ;表示變量聲明在.可是不知道不肯定變量究竟是個什麼東西.
上面我在代碼裏面經過註釋大概解釋了why. javascript
細微變換一下: html
console.log(var10);//undefined.注意這裏的var10是在這個語句的後面聲明的.爲何不是is not defined呢?由於Javascript語言是"先解析,後運行",運行時就已經完成了變量聲明,這實際上是javascript的"代碼提高"(hoisting)功能.如今只對var聲明的變量作hoisting var var10;若是不是變量.而是對象裏面的屬性.
var obj1 = {}; console.log(obj1.attr1);//undefined,對象裏面的屬性沒有.雖然attr1歷來沒有聲明過.可是卻未報錯is not defined.引擎對此網開一面了.
function Fun1() { } var fun1 = new Fun1(); console.log(fun1.attr1);//undefined,這裏用function.其實function本也是對象.new完就是object.undefined參與運算的狀況:
var ufo2=ufo2||3;//運算的地方確定是undefined;由於前面有作ufo2的聲明.可是運算的時候還未賦值.因此undefined至關於false. console.log(ufo2);//3
var ufo4; if(ufo4) { console.log("yes"); }else{ console.log("no");//print no.undefined相對與false }
若是是下面怎樣瀏覽器就報錯了. java
if(ufo3){//ufo3 is not defined. }
工做中咱們常常須要判斷某個變量或者屬性是否爲undefined。一般使用以下方法:(這裏是變量age聲明的狀況下) 瀏覽器
var age; //方法1 console.log(typeof age === 'undefined');//只能用 === 運算來測試某個值是不是未定義的,由於 == 運算符認爲 undefined 值等價於 null。
//方法2 console.log(age === undefined);//null 表示無值,而 undefined 表示一個未聲明的變量,或已聲明但沒有賦值的變量,或一個並不存在的對象屬性。若是不聲明age.方式2會報錯.這就是前面說過的.未聲明的變量(is not defined)參與typeof運算是能夠的.
第一種方式是先階段應用最廣且不容易犯錯的方式.推薦使用. 框架
undefined是沒法使用 for/in 循環來枚舉的,也不能用 delete 運算符來刪除它。undefined 不是常量,能夠把它設置爲其餘值。因此不少框架代碼作當即執行的時候都會把undefined作爲參數傳入.怎樣能夠避免其餘人去修改undefined的原始值.我的以爲ECMA應該把這個修改成只讀.當嘗試讀取不存在的對象屬性時也會返回undefined。
測試
關於判斷問題請擴展閱讀這篇文章. spa