理解Javascript_02_理解undefined和null
更新時間:2010年10月11日 22:59:31 作者:
其實(shí)在 ECMAScript 的原始類型中,是有Undefined 和 Null 類型的。 這兩種類型都分別對應(yīng)了屬于自己的唯一專用值,即undefined 和 null。
來自普遍的回答:
其實(shí)在 ECMAScript 的原始類型中,是有Undefined 和 Null 類型的。 這兩種類型都分別對應(yīng)了屬于自己的唯一專用值,即undefined 和 null。
值 undefined 實(shí)際上是從值 null 派生來的,因此 ECMAScript 把它們定義為相等的,通過下列代碼可以驗(yàn)證這一結(jié)論:
alert(undefined == null); //true
盡管這兩個值相等,但它們的含義不同。
undefined 是聲明了變量但未對其初始化時賦予該變量的值,null 則用于表示尚未存在的對象。如果函數(shù)或方法要返回的是對象,那么找不到該對象時,返回的通常是 null。
所以alert(undefined===null);//false
說實(shí)話,我沒有看明白,為什么undefined會繼承null,即然是繼承那為什么undefined!==null,還有未初始化的變量與函數(shù)返回的對象不存在之間有什么區(qū)別,問題種種,讓人很不信服。
看看內(nèi)存是怎么說的:
Udefined代表沒有賦值的基本數(shù)據(jù)類型。
Null代表沒有賦值的引用數(shù)據(jù)類型。
我們來看一段代碼:
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
再來看一下內(nèi)存的情況:

解決第一個問題:為什么undefine繼承自null
在Javascript中,基本數(shù)據(jù)類型都有一個與其對應(yīng)的引用數(shù)據(jù)類型,number Number,string String,boolean Boolean...,他們具有完全相同的行為,并且相互之間會產(chǎn)生自動拆箱與裝箱的操作。在內(nèi)存分析一文中已經(jīng)講述了基本數(shù)據(jù)類型放在棧內(nèi)存中的意義,由此這們可以得出一個膚淺的結(jié)論:基本數(shù)據(jù)類型是對應(yīng)引用數(shù)據(jù)類型的子類,只不過是為了提高效率,將其放在棧內(nèi)存中而已,對應(yīng)的Undefined代表無值的基本類型,Null代表無值的引用類型,那勢必就可以推出undefined繼承null。
解決第二個問題:為什么undefined==null
推出來的答案undefined繼承自null,內(nèi)存告訴我們的答案他們都處于棧中
解決第三個問題:為什么undefined!==null
內(nèi)存告訴我們,它們的意義確實(shí)是不一樣的,老話一句:Udefined代表沒有賦值的基本數(shù)據(jù)類型,Null代表沒有賦值的引用數(shù)據(jù)類型。他們的內(nèi)存圖有很大的區(qū)別
解決額外的問題:null是處理引用的,為什么null處在棧內(nèi)存中,而不是堆內(nèi)存中
答案一樣的簡單,效率!有必要在棧中分配一塊額外的內(nèi)存去指向堆中的null嗎!
額外的收獲:
當(dāng)我們要切斷與對象的聯(lián)系,但又并不想給變量賦于其他的值,那么我們可了置null,如var obj = new Object();obj=null;
一些關(guān)于undefined和null的行為
null 參與數(shù)值運(yùn)算時其值會自動轉(zhuǎn)換為 0 ,因此,下列表達(dá)式計算后會得到正確的數(shù)值:
表達(dá)式:123 + null 結(jié)果值:123
typeof null 返回object,因?yàn)閚ull代表是無值的引用。
undefined是全局對象(window)的一個特殊屬性,其值為Undefined類型的專用值undefined
undefined參與任何數(shù)值計算時,其結(jié)果一定是NaN。
當(dāng)聲明的變量未初始化時,該變量的默認(rèn)值是undefined,但是undefined并不同于未定義的值。Typeof運(yùn)算符無法區(qū)分這兩種值
因此對于變量是否存在的判斷操作是通過if(typeof var == ‘undefined'){ //code here } 來進(jìn)行判斷的,這樣既完全兼容未定義(undefined)和未初始化(uninitialized)兩種情況的
哈哈,當(dāng)你站在內(nèi)存的高度的分析問題的時候,如此抽象的東西有了實(shí)際的表現(xiàn),一切變得簡單起來!
其實(shí)在 ECMAScript 的原始類型中,是有Undefined 和 Null 類型的。 這兩種類型都分別對應(yīng)了屬于自己的唯一專用值,即undefined 和 null。
值 undefined 實(shí)際上是從值 null 派生來的,因此 ECMAScript 把它們定義為相等的,通過下列代碼可以驗(yàn)證這一結(jié)論:
alert(undefined == null); //true
盡管這兩個值相等,但它們的含義不同。
undefined 是聲明了變量但未對其初始化時賦予該變量的值,null 則用于表示尚未存在的對象。如果函數(shù)或方法要返回的是對象,那么找不到該對象時,返回的通常是 null。
所以alert(undefined===null);//false
說實(shí)話,我沒有看明白,為什么undefined會繼承null,即然是繼承那為什么undefined!==null,還有未初始化的變量與函數(shù)返回的對象不存在之間有什么區(qū)別,問題種種,讓人很不信服。
看看內(nèi)存是怎么說的:
Udefined代表沒有賦值的基本數(shù)據(jù)類型。
Null代表沒有賦值的引用數(shù)據(jù)類型。
我們來看一段代碼:
復(fù)制代碼 代碼如下:
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
再來看一下內(nèi)存的情況:

解決第一個問題:為什么undefine繼承自null
在Javascript中,基本數(shù)據(jù)類型都有一個與其對應(yīng)的引用數(shù)據(jù)類型,number Number,string String,boolean Boolean...,他們具有完全相同的行為,并且相互之間會產(chǎn)生自動拆箱與裝箱的操作。在內(nèi)存分析一文中已經(jīng)講述了基本數(shù)據(jù)類型放在棧內(nèi)存中的意義,由此這們可以得出一個膚淺的結(jié)論:基本數(shù)據(jù)類型是對應(yīng)引用數(shù)據(jù)類型的子類,只不過是為了提高效率,將其放在棧內(nèi)存中而已,對應(yīng)的Undefined代表無值的基本類型,Null代表無值的引用類型,那勢必就可以推出undefined繼承null。
解決第二個問題:為什么undefined==null
推出來的答案undefined繼承自null,內(nèi)存告訴我們的答案他們都處于棧中
解決第三個問題:為什么undefined!==null
內(nèi)存告訴我們,它們的意義確實(shí)是不一樣的,老話一句:Udefined代表沒有賦值的基本數(shù)據(jù)類型,Null代表沒有賦值的引用數(shù)據(jù)類型。他們的內(nèi)存圖有很大的區(qū)別
解決額外的問題:null是處理引用的,為什么null處在棧內(nèi)存中,而不是堆內(nèi)存中
答案一樣的簡單,效率!有必要在棧中分配一塊額外的內(nèi)存去指向堆中的null嗎!
額外的收獲:
當(dāng)我們要切斷與對象的聯(lián)系,但又并不想給變量賦于其他的值,那么我們可了置null,如var obj = new Object();obj=null;
一些關(guān)于undefined和null的行為
null 參與數(shù)值運(yùn)算時其值會自動轉(zhuǎn)換為 0 ,因此,下列表達(dá)式計算后會得到正確的數(shù)值:
表達(dá)式:123 + null 結(jié)果值:123
typeof null 返回object,因?yàn)閚ull代表是無值的引用。
undefined是全局對象(window)的一個特殊屬性,其值為Undefined類型的專用值undefined
undefined參與任何數(shù)值計算時,其結(jié)果一定是NaN。
當(dāng)聲明的變量未初始化時,該變量的默認(rèn)值是undefined,但是undefined并不同于未定義的值。Typeof運(yùn)算符無法區(qū)分這兩種值
因此對于變量是否存在的判斷操作是通過if(typeof var == ‘undefined'){ //code here } 來進(jìn)行判斷的,這樣既完全兼容未定義(undefined)和未初始化(uninitialized)兩種情況的
哈哈,當(dāng)你站在內(nèi)存的高度的分析問題的時候,如此抽象的東西有了實(shí)際的表現(xiàn),一切變得簡單起來!
您可能感興趣的文章:
相關(guān)文章
HTML5開發(fā)Kinect體感游戲的實(shí)例應(yīng)用
這篇文章主要介紹了HTML5開發(fā)Kinect體感游戲的實(shí)例應(yīng)用的相關(guān)資料,希望通過本文能夠幫助到大家,需要的朋友可以參考下2017-09-09JavaScript如何利用Promise控制并發(fā)請求個數(shù)
大家都知道js是單線程,并不存在真正的并發(fā),但是由于JavaScript的Event Loop機(jī)制,使得異步函數(shù)調(diào)用有了“并發(fā)”這樣的假象。這篇文章主要給大家介紹了關(guān)于JavaScript如何利用Promise控制并發(fā)請求個數(shù)的相關(guān)資料,需要的朋友可以參考下2021-05-05js下將阿拉伯?dāng)?shù)字每三位一逗號分隔(如:15000000轉(zhuǎn)化為15,000,000)
這篇文章主要介紹了js下將阿拉伯?dāng)?shù)字每三位一逗號分隔(如:15000000轉(zhuǎn)化為15,000,000),需要的朋友可以參考下2014-06-06JS實(shí)現(xiàn)切換標(biāo)簽頁效果實(shí)例代碼
這篇文章介紹了JS實(shí)現(xiàn)切換標(biāo)簽頁效果實(shí)例代碼,有需要的朋友可以參考一下2013-11-11