程式設計師是這樣區分Null和Undefined

2022-05-07 04:57:09 字數 2199 閱讀 2265

null型別

null型別是第二個只有乙個值的資料型別,這個特殊的值是null。從邏輯角度來看,null值表示乙個空物件指標,而這也正是使用typeof操作符檢測null值時會返回"object"的原因,如下面的例子所示:

var car = null;

alert(typeof car);    // "object"

如果定義的變數準備在將來用於儲存物件,那麼最好將該變數初始化為 null 而不是其他值。這樣一來,只要直接檢查null值就可以知道相應的變數是否已經儲存了乙個物件的引用,如下面的例子所示:

if (car != null){

// 對car物件執行某些操作

實際上,undefined值是派生自null值的,因此ecma-262規定對它們的相等性測試要返回true:

alert(null == undefined);    //true

這裡,位於null和undefined之間的相等操作符(==)總是返回true,不過要注意的是,這個操作符出於比較的目的會轉換其運算元,儘管null和undefined有這樣的關係,但它們的用途完全不同。如前所述,無論在什麼情況下都沒有必要把乙個變數的值顯式地設定為undefined,可是同樣的規則對null卻不適用。換句話說,只要意在儲存物件的變數還沒有真正儲存物件,就應該明確地讓該變數儲存null值。這樣做不僅可以體現null作為空物件指標的慣例,而且也有助於進一步區分null和undefined。

undefined型別

undefined型別只有乙個值,即特殊undefined。在使用var宣告變數但未對其加以初始化時,這個變數的值就是undefined,例如:

var message;

alert(message == undefined); //true

這個例子只宣告了變數message,但未對其進行初始化。比較這個變數與undefined字面量,結果表明它們是相等的。這個例子與下面的例子是等價的:

var message = undefined;

alert(message == undefined); //true

這個例子使用undefined值顯式初始化了變數message。但我們沒有必要這麼做,因為未經初始化的值預設就會取得undefined值。

一般而言,不存在需要顯式地把乙個變數設定為undefined值的情況。字面值undefined的主要目的是用於比較,而ecma-262第3版之前的版本中並沒有規定這個值。第3版引入這個值是為了正式區分空物件指標與未經初始化的變數。

不過,包含undefined值的變數與尚未定義的變數還是不一樣的。看看下面這個例子:

var message; // 這個變數宣告之後預設取得了undefined值

// 下面這個變數並沒有宣告

// var age

alert(message);    // "undefined"

alert(age);    // 產生錯誤

執行以上**,第乙個警告框會顯示變數message的值,即"undefined"。而第二個警告框——由於傳遞給alert()函式的是尚未宣告的變數age——則會導致乙個錯誤。對於尚未宣告過的變數,只能執行一項操作,即使用typeof操作符檢測其資料型別(對未經宣告的變數呼叫delete不會導致錯誤,但這樣做沒什麼實際意義,而且在嚴格模式下確實會導致錯誤)。

然而,令人困惑的是:對未初始化的變數執行typeof  操作符會返回  undefined  值,而對未宣告的變數執行typeof操作符同樣也會返回undefined值。來看下面的例子:

var message; // 這個變數宣告之後預設取得了undefined值

// 下面這個變數並沒有宣告

// var age

alert(typeof message);    // "undefined"

alert(typeof age);    // "undefined"

結果表明,對未初始化和未宣告的變數執行typeof操作符都返回了undefined值;這個結果有 其邏輯上的合理性。因為雖然這兩種變數從技術角度看有本質區別,但實際上無論對哪種變數也不可能執行真正的操作。

即便未初始化的變數會自動被賦予undefined值,但顯式地初始化變數依然是明智的選擇。如果能夠做到這一點,那麼當typeof操作符返回"undefined"值時,我們就知道被檢測的變數還沒有被宣告,而不是尚未初始化。

程式設計師是這樣幹的嘛

程式設計師是這樣幹的嘛 畢業至今,從事it行業已有4年工作時間.這一路走來,做過編碼,做過測試,做過實施工作,有過喜,有過憂.喜是克服了編碼過程的難度問題.憂的是軟體是這樣幹的嘛,是不停的去修補,不停的產生bug,在生產線上不停的修改bug嘛 我親身經歷乙個千萬的系統整合工程,而這個千萬的系統整合過...

程式設計師是這樣煉成的 8 1 1 2

今天加班到10點才回家,最近整個專案組鬧鬧哄哄的,原因是出現了不水產的聲音。原本的安排的是 a,b兩組人分別完成兩個專案,卻因為開始工作任務分配的不合理,終於惹出了麻煩。a組的任務是 做乙個客戶的專案,計畫是6月份完成,人員投入工作量60 b組的任務是 開發出乙個平台,用來支援一系列a組未來的客戶專...

程式設計師是這樣煉成的 8 1 1 2

今天加班到10點才回家,最近整個專案組鬧鬧哄哄的,原因是出現了不水產的聲音。原本的安排的是 a,b兩組人分別完成兩個專案,卻因為開始工作任務分配的不合理,終於惹出了麻煩。a組的任務是 做乙個客戶的專案,計畫是6月份完成,人員投入工作量60 b組的任務是 開發出乙個平台,用來支援一系列a組未來的客戶專...