(轉)理解Javascript_02_理解undefined和null

原文地址:http://www.cnblogs.com/fool/archive/2010/10/07/1845253.html#top

來自普遍的回答:

其實在 ECMAScript 的原始類型中,是有Undefined 和 Null 類型的。 這兩種類型都分別對應了屬於自己的唯一專用值,即undefined 和 null。 
值 undefined 實際上是從值 null 派生來的,因此 ECMAScript 把它們定義爲相等的,通過下列代碼可以驗證這一結論: 
alert(undefined == null); //true


儘管這兩個值相等,但它們的含義不同。

undefined 是聲明瞭變量但未對其初始化時賦予該變量的值,null 則用於表示尚未存在的對象。如果函數或方法要返回的是對象,那麼找不到該對象時,返回的通常是 null。

所以alert(undefined===null);//false

 

說實話,我沒有看明白,爲什麼undefined會繼承null,即然是繼承那爲什麼undefined!==null,還有未初始化的變量與函數返回的對象不存在之間有什麼區別,問題種種,讓人很不信服。

 

看看內存是怎麼說的:

Udefined代表沒有賦值的基本數據類型。

Null代表沒有賦值的引用數據類型。

我們來看一段代碼:

1
2
3
4
5
6
7
8
var age;
var id = 100;
var div02 = document.getElementById("div02");//注:div02是不存在的
var div01 = document.getElementById("div01");//注:div01存在
alert(id);//100
alert(age);//undefined
alert(div02);//null
alert(div01);//object

再來看一下內存的情況:

解決第一個問題:爲什麼undefine繼承自null

在Javascript中,基本數據類型都有一個與其對應的引用數據類型,number Number,string String,boolean Boolean...,他們具有完全相同的行爲,並且相互之間會產生自動拆箱與裝箱的操作。在內存分析一文中已經講述了基本數據類型放在棧內存中的意義,由此這們可以得出一個膚淺的結論:基本數據類型是對應引用數據類型的子類,只不過是爲了提高效率,將其放在棧內存中而已,對應的Undefined代表無值的基本類型,Null代表無值的引用類型,那勢必就可以推出undefined繼承null。

解決第二個問題:爲什麼undefined==null

 推出來的答案undefined繼承自null,內存告訴我們的答案他們都處於棧中

解決第三個問題:爲什麼undefined!==null

內存告訴我們,它們的意義確實是不一樣的,老話一句:Udefined代表沒有賦值的基本數據類型,Null代表沒有賦值的引用數據類型。他們的內存圖有很大的區別

解決額外的問題:null是處理引用的,爲什麼null處在棧內存中,而不是堆內存中

答案一樣的簡單,效率!有必要在棧中分配一塊額外的內存去指向堆中的null嗎!

額外的收穫:

當我們要切斷與對象的聯繫,但又並不想給變量賦於其他的值,那麼我們可了置null,如var obj = new Object();obj=null;

 

一些關於undefined和null的行爲

 null 參與數值運算時其值會自動轉換爲 0 ,因此,下列表達式計算後會得到正確的數值:

表達式:123 + null    結果值:123

typeof null 返回object,因爲null代表是無值的引用。

 

undefined是全局對象(window)的一個特殊屬性,其值爲Undefined類型的專用值undefined

undefined參與任何數值計算時,其結果一定是NaN。

 當聲明的變量未初始化時,該變量的默認值是undefined,但是undefined並不同於未定義的值。Typeof運算符無法區分這兩種值

因此對於變量是否存在的判斷操作是通過if(typeof var == ‘undefined’){ //code here } 來進行判斷的,這樣既完全兼容未定義(undefined)未初始化(uninitialized)兩種情況的

 

哈哈,當你站在內存的高度的分析問題的時候,如此抽象的東西有了實際的表現,一切變得簡單起來!

 

-----------------------------更新 2010/11/01 --------------------------------------------

undefined與參數判斷

我們行來看一個簡單的函數:

1
2
3
4
5
6
function bool(val){
       if(typeof val == 'undefined'){
            return true;
        }
        return !!val;
}

這個函數有問題嗎?有,因爲typeof返回undefined值有兩種可能,一種是傳進來的就是undefined,還有一種是沒有傳值。

1
2
alert(bool(undefined));//true
alert(bool());//true
 

很明顯,bool(undefined)返回了不是我們所期望的false.怎麼解決這個問題呢?

1
2
3
4
5
6
function bool(val){
    if(arguments.length !==0){
        return !!val;
    }
    return true;   
}

我們通過arguments參數長度來判斷是否傳遞了參數,從而區分函數傳遞的參數是undefined,還是根本不就沒有傳值! 


發佈了31 篇原創文章 · 獲贊 3 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章