javascript 中 "undefined" 與 "is not defined" 分析

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

相關文章
相關標籤/搜索