javascript 中null和undefined區(qū)分和比較
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)成安免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Undefined類(lèi)型
Undefined 類(lèi)型只有一個(gè)值,即特殊 undefined 。在使用 var 聲明變量但未對(duì)其加以初始化時(shí),這個(gè)變量的值就是 undefined ,
例如:
var message; alert(message == undefined); //true
這個(gè)例子只聲明了變量 message ,但未對(duì)其進(jìn)行初始化。比較這個(gè)變量與 undefined 字面量,結(jié)果表明它們是相等的。這個(gè)例子與下面的例子是等價(jià)的:
var message = undefined; alert(message == undefined); //true
這個(gè)例子使用 undefined 值顯式初始化了變量message 。但我們沒(méi)有必要這么做,因?yàn)槲唇?jīng)初始化的值默認(rèn)就會(huì)取得 undefined 值。
一般而言,不存在需要顯式地把一個(gè)變量設(shè)置為undefined 值的情況。字面值 undefined 的主要目的是用于比較,而ECMA-262第3版之前的版本中并沒(méi)有規(guī)定這個(gè)值。第3版引入這個(gè)值是為了正式區(qū)分空對(duì)象指針與未經(jīng)初始化的變量。
不過(guò),包含 undefined 值的變量與尚未定義的變量還是不一樣的。看看下面這個(gè)例子:
var message; // 這個(gè)變量聲明之后默認(rèn)取得了undefined值 // 下面這個(gè)變量并沒(méi)有聲明 // var age alert(message); // "undefined" alert(age); // 產(chǎn)生錯(cuò)誤
運(yùn)行以上代碼,第一個(gè)警告框會(huì)顯示變量message 的值,即 “undefined” 。而第二個(gè)警告框——由于傳遞給 alert() 函數(shù)的是尚未聲明的變量age ——?jiǎng)t會(huì)導(dǎo)致一個(gè)錯(cuò)誤。對(duì)于尚未聲明過(guò)的變量,只能執(zhí)行一項(xiàng)操作,即使用 typeof 操作符檢測(cè)其數(shù)據(jù)類(lèi)型(對(duì)未經(jīng)聲明的變量調(diào)用delete 不會(huì)導(dǎo)致錯(cuò)誤,但這樣做沒(méi)什么實(shí)際意義,而且在嚴(yán)格模式下確實(shí)會(huì)導(dǎo)致錯(cuò)誤)。
然而,令人困惑的是:對(duì)未初始化的變量執(zhí)行typeof 操作符會(huì)返回 undefined 值,而對(duì)未聲明的變量執(zhí)行typeof操作符同樣也會(huì)返回undefined值。來(lái)看下面的例子:
var message; // 這個(gè)變量聲明之后默認(rèn)取得了undefined值 // 下面這個(gè)變量并沒(méi)有聲明 // var age alert(typeof message); // "undefined" alert(typeof age); // "undefined"
結(jié)果表明,對(duì)未初始化和未聲明的變量執(zhí)行 typeof 操作符都返回了 undefined 值;這個(gè)結(jié)果有 其邏輯上的合理性。因?yàn)殡m然這兩種變量從技術(shù)角度看有本質(zhì)區(qū)別,但實(shí)際上無(wú)論對(duì)哪種變量也不可能執(zhí)行真正的操作。
提示:
即便未初始化的變量會(huì)自動(dòng)被賦予undefined值,但顯式地初始化變量依然是明智的選擇。如果能夠做到這一點(diǎn),那么當(dāng)typeof操作符返回”undefined”值時(shí),我們就知道被檢測(cè)的變量還沒(méi)有被聲明,而不是尚未初始化。
Null類(lèi)型
Null 類(lèi)型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類(lèi)型,這個(gè)特殊的值是null。從邏輯角度來(lái)看, null 值表示一個(gè) 空對(duì)象指針 ,而這也正是使用 typeof 操作符檢測(cè) null 值時(shí)會(huì)返回 “object” 的原因,如下面的例子所示:
var car = null; alert(typeof car); // "object"
如果定義的變量準(zhǔn)備在將來(lái)用于保存對(duì)象,那么最好將該變量初始化為 null 而不是其他值。這樣一來(lái),只要直接檢查null值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對(duì)象的引用,如下面的例子所示:
if (car != null){ // 對(duì)car對(duì)象執(zhí)行某些操作 } 實(shí)際上,undefined值是派生自null值的,因此ECMA-262規(guī)定對(duì)它們的相等性測(cè)試要返回true: alert(null == undefined); //true
這里,位于 null 和 undefined 之間的相等操作符(==)總是返回 true ,不過(guò)要注意的是,這個(gè)操作符出于比較的目的會(huì)轉(zhuǎn)換其操作數(shù),盡管null 和 undefined 有這樣的關(guān)系,但它們的用途完全不同。如前所述,無(wú)論在什么情況下都沒(méi)有必要把一個(gè)變量的值顯式地設(shè)置為 undefined,可是同樣的規(guī)則對(duì) null 卻不適用。換句話說(shuō),只要意在保存對(duì)象的變量還沒(méi)有真正保存對(duì)象,就應(yīng)該明確地讓該變量保存 null 值。這樣做不僅可以體現(xiàn)null 作為空對(duì)象指針的慣例,而且也有助于進(jìn)一步區(qū)分 null 和 undefined。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!