JavaScript的數據類型大致分爲兩類:原始類型和對象類型。其中,原始類型包括數字、字符串和布爾值。此外,JavaScript中還有兩個特殊的原始值:null(空)和undefined(未定義),它們不是數字、字符串和布爾值,它們一般分別表明各自特殊類型中惟一的成員。數組
null函數
null是JavaScript語言的關鍵字,它表示一個特殊值,經常使用來描述「空值」。對null執行typeof預算,結果返回字符串「object"(以下圖),因此說,也能夠將null認爲是一個特殊的對象值,它的含義是「非對象」。但實際上,一般認爲null是它自有類型的惟一的一個成員,它能夠表示數字、字符串、對象是「無值」的。spa
typeof(null); // object
undefined3d
undefined也能夠用來表示值的空缺。它和null不同,它不是關鍵字,它是變量的一種取值,代表變量沒有初始化,在查詢對象的屬性或數組元素的值時返回undefined,則說明這個屬性或元素不存在。若是函數沒有返回任何值,則返回undefined。引用沒有提供實參的函數形參的值也只會獲得undefined。undefined是預約義的全局變量,它的值就是「未定義」。對象
null和undefined相同之處blog
null和undefined都是徹底不可變的值,都沒有屬性和方法,也不能給它們添加屬性或者賦值(由於它們根本沒有屬性)。若是試圖定義一個屬性將會引起一個類型錯誤(以下圖),它們是徹底無效的值。ip
在JavaScript中,「沒有值」表明的布爾值是false,這意味着他們在條件上下文中會被被計算爲false,如if語句中。內存
注意:使用相等操做符( == )比較這兩個值和其餘false值是不相等的,若是比較它們兩個是相等的,可是不全等(===),由於類型不同。字符串
疑問:既然null和undefined在if判斷語句中都表示爲false,爲何不能和false值相等呢?class
用等於(==)操做符將false對象和其餘對象進行比較的時候,會發現,只有0和空字符串等於false;undefined和null對象並不等於false對象,而null和undefined是相等的。因此,能夠把0、空字符串和false歸爲一類,稱爲「假值」;把null和undefined歸爲一類,稱爲"空值"。(我的理解:也就是說在JavaScript中,假值和空值都有一個共性,那就是在做爲if的條件分支時,均被視爲false ;應用"!"操做以後獲得的均爲true )
舉例說明一下:
if語句中,null舉例說明
if語句中,undefined舉例說明
null和undefined區別
null和undefined基本是同義的,只有一些細微的差異。
一、null是一個表示「沒有」的對象,轉爲數值時爲0;undefined是一個表示"未定義"的原始值,轉爲數值時爲NaN。
2、null表示「沒有對象」,即該處不該該有值。undefined表示"缺乏值",就是此處應該有一個值,可是尚未定義。
3、null和undefined經過typeof判斷出的結果不同。
備註:有資料顯示,typeof的這種行爲已經被確認爲一個錯誤,雖然提出了修正,出於後兼容的目的,這一點已經保持不變。
擴展:
在ECMAScript 3中,undefined是可讀/寫的變量,能夠給它賦任意值。這個錯誤在ECMAScript 5中作了修正,undefined在該版本中是隻讀的。
null常常被用於顯式地指定變量爲無效(object= null)當一個引用再也不是必需的,經過分配null值,有效地清除引用,並假設對象沒有引用其餘代碼,指定垃圾收集,確保回收內存。有時也會在定義變量時,初始化爲null;
undefined不多或者說不建議用在任何地方,undefined常常會出如今許多的方法代碼中。一般遇到當試圖訪問一個不存在的值時,只會默認返回一個undefined值,而不是上升爲一個錯誤。 任何聲明變量時沒有提供一個初始值,都會有一個爲undefined的默認值。
總結:能夠把undefined認爲是表示系統級的、出乎意料的、或者是相似錯誤的值的空缺,而null是表示程序級的、正常的或在乎料之中的值的空缺。若是想把它們賦值給變量或者屬性,或將它們做爲參數傳人函數,最佳選擇是使用null。