在程序語言中定義的各類各樣的數據類型中,咱們都會爲其定義一個"空值"或"假值",好比對象類型的空值null,.NET Framework中數據庫字段的空值DBNull,boolean類型的假值false等等。在JavaScript中也有不少種的"空值"和"假值",那麼它們都有什麼共同點和不一樣點呢?
其實標題裏面我已經列出了JavaScript中全部的"空值"和"假值",除了boolean值自己就是true和false這兩種狀況外,其它數據類型的"空值"主要是undefined和defined這兩大類。這些空值的類型分別是:javascript
typeof(undefined) == 'undefined' typeof(null) == 'object' typeof("") == 'string' typeof(0) == 'number' typeof(false) == 'boolean'
這五個值的共同點是,在if語句中作判斷,都會執行false分支。固然從廣義上來看,是說明這些數值都是其對應數據類型上的無效值或空值。還有這五個值做!運算,結果全爲:true。
這幾個值中也有不一樣,其中undefined和null比較特殊,雖然null的類型是object,可是null不具備任何對象的特性,就是說咱們並不能執行null.toString()、null.constructor等對象實例的默認調用。因此從這個意義上來講,null和undefined有最大的類似性。看看null == undefined的結果(true)也就更加能說明這點。不過類似歸類似,仍是有區別的,就是和數字運算時,10 + null結果爲:10;10 + undefined結果爲:NaN。java
另外""、0和false雖然在if語句表現爲"假值",可它們都是有意義數據,只是被做爲了"空值"或"假值",由於:"".toString(),(0).toString()和false.toString()都是合法的可執行表達式。
其實這5個值在上面所說的這些差別裏,並不太會給程流程控制帶來太大的問題,那麼要區分它們什麼呢?須要注意區分的是這些值在轉換爲String時的差別是比較大的,它們到String的轉換關係是:mysql
String(undefined) -> "undefined" String(null) -> "null" String("") -> "" String(0) -> "0" String(false) -> "false"
這個轉換關係在作字符串累加時須要特別的注意,否這會出些意想不到的問題。sql