JavaScript中null和undefined
JavaScript的數據類型大體分為兩類:原始類型和對象類型。其中,原始類型包括數字、字符串和布爾值。此外,JavaScript中還有兩個特殊的原始值:null(空)和undefined(未定義),它們不是數字、字符串和布爾值,它們通常分別代表各自特殊類型中唯一的成員。
null
null是JavaScript語言的關鍵字,它表示一個特殊值,常用來描述“空值”。對null執行typeof預算,結果返回字符串“object"(如下圖),所以說,也可以將null認為是一個特殊的對象值,它的含義是“非對象”。但實際上,通常認為null是它自有類型的唯一的一個成員,它可以表示數字、字符串、對象是“無值”的。
typeof(null); // object
undefined
undefined也可以用來表示值的空缺。它和null不一樣,它不是關鍵字,它是變量的一種取值,表明變量沒有初始化,在查詢對象的屬性或數組元素的值時返回undefined,則說明這個屬性或元素不存在。如果函數沒有返回任何值,則返回undefined。引用沒有提供實參的函數形參的值也只會得到undefined。undefined是預定義的全局變量,它的值就是“未定義”。
null和undefined相同之處
null和undefined都是完全不可變的值,都沒有屬性和方法,也不能給它們添加屬性或者賦值(因為它們根本沒有屬性)。如果試圖定義一個屬性將會引發一個類型錯誤(如下圖),它們是完全無效的值。
在 JavaScript中,“ 沒有值 ”代表的布爾值是false,這意味著他們在條件上下文中會被被計算為false,如if語句中。
注意:使用相等操作符 ( == )比較這兩個值和其他false值是不相等的,如果比較它們兩個是相等的,但是不全等(===),因為類型不一樣。
疑問:既然 null和undefined在if判斷語句中都表示為false,為什么不能和false值相等呢?
用等于( ==)操作符將false對象和其他對象進行比較的時候,會發現,只有0和空字符串等于false;undefined和null對象并不等于false對象,而null和undefined是相等的。所以,可以把0、空字符串和false歸為一類,稱為“假值”;把null和undefined歸為一類,稱為"空值"。( 個人理解:也就是說在 JavaScript中,假值和空值都有一個共性,那就是在作為if的條件分支時,均被視為false ;應用"!"操作之后得到的均為true )
舉例說明一下:
if語句中,null舉例說明
if語句中,undefined舉例說明
null和undefined區別
null和undefined基本是同義的,只有一些細微的差別。
1、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。
來自:http://www.cnblogs.com/webhome/p/6272940.html