下班吃飯的時候,同事偶然問了1個問題:undefined和null到底有甚么區分?沒法回答,回去查閱相干資料,算了有了1個了解,做相干的總結,在開始之前,請看以下代碼,算是拋出這個問題:
上述結果可以給我們1個這樣的理解: undefined和null兩個值相等,但是他們含義不同。具體二者有甚么區分,先理解下undefined和null在做分析。
undefined類型只有1個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化,這個變量的值就是undefined。例如:
上面兩種寫法是等價的,未經初始化的值默許就會獲得undefined值。
Tips:1般而言不需要顯示的把1個變量設置為undefined,undefined的主要目的在于比較,ECMA第3版引入這個值正是為了辨別空對象指針null和未經初始化的變量
既然談到了null,這里在多補充1點,對為初始化的變量履行typeof返回undefined值,對為聲明的變量履行typeof也會返回undefined值,以下例子:
這個結果有邏輯上的公道性,雖然null和undefined在技術角度上有本質區分,但是實際中不可能對兩種變量進行操作。在這類情況下如果我們習慣聲明變量就進行初始化的時候,當typeof操作符返回“undefined”值時,我們就知道有變量還沒有被聲明,而不是還沒有初始化。
null類型也是只有1個值null,從邏輯角度來看,null值表示1個空對象指針,不信?看以下代碼就知道了:
所以在變量是用于保存對象時,最后將之初始化為null,可以很方便的知道變量是不是保存了1個對象的援用。
分別的了解了這兩種類型,到這里似乎有所理解,但又不具體。回到最初拋出的問題,在ECMAScript的原始類型中,是有undefined和null類型的,這兩種類型分別對應了屬于自己的唯1值undefined和null。undefined實際上是從null派生而來,這就能夠解釋undefined==null為true了。
就undefined===null為false分兩個方面來理解:
很明顯,他們的地址分配不1樣,我想著對有后端基礎的同學來講很容易理解,具體以下圖:
雖然undefined==null為true,但是他們的用處是不1樣的。就像前面所述,不管甚么情況都沒有必要將1個變量值顯示的指定為undefined,默許值為undefined,但是默許的規則對null卻不適用。由于null表示沒有指向對象的援用。
總的來講,undefined派生于null,他們是“=="的,另外一層面上undefined表示沒有賦值的基本數據類型,null表示沒有賦值的援用數據類型,他們不能“===”。
下一篇 計算機圖形學中的常用模型