寫出更好的JavaScript之undefined篇(上)

來源:互聯網
上載者:User

“全域變數”和“全域對象的屬性”是指同樣的東西,只是因為要配合上下文才用了不同的說法,本文中我就不再另外解釋了;“聲明”指通過“var”語句聲明變數和/或對函數及其簽名的定義;“變數”指通過“var”語句聲明過或者在函數體中試圖訪問的具名引數;“undefined”指名為“undefined”的值(全域或本地變數),而“未定義”指type(...) == “undefined”的情況;“output”是一個顯示傳入參數的函數,可以看作是“alert”的同類。

我們寫JavaScript程式的時候總有需要用到“未定義”的時候,比方說我們要知道某一個值是不是已經經過賦值,或者我們希望消除某一個已經賦予的值,我們就可能這樣做: 複製代碼 代碼如下:output(myVar === undefined);
myVar = undefined;

然而這樣做並不太好,如果我們嘗試“讀”(或者比較)一個不存在的變數,就會引發一個異常。
比方說如果因為設計得不夠周全,執行上面的代碼的時候還沒有定義過myVar這個變數,上面的代碼就會出錯;
另外在較早的瀏覽器版本上,也不存在undefined這個預定義值,所以為了提高相容性和容錯性,我們可以這樣做: 複製代碼 代碼如下:output(typeof(myVar) == "undefined");
myVar = void(0);

typeof運算子是JavaScript的語言功能,雖然上面的代碼看起來像是這樣的一種東西: 複製代碼 代碼如下:output(oneFunction(myVar) == "undefined");
myVar = void(0);

但這兩者有一個重要區別——當myVar不存在的時候,前者可以正確執行,並返回字串"undefined";而後者不管內部構造是什麼樣的,都會引發異常。
void則是另一個語言功能,這個運算子的意義是向指令碼的其它部分隱藏它的傳入參數;而假如有一個語句試圖得到void“運算”的結果,它就只能得到“未定義”。
因為void的這個特性,void最常見的功能就有兩種:一是像上面的代碼中那樣將“未定義”值賦予給其它變數/屬性;另一種就是像下面這樣:
<a href="javascript:void(favList.push(curItem));">添加到收藏列表</a>
其中favList是一個JavaScript數組,而curItem是一個已經定義的對象——數組的push方法會返回執行push操作以後數組的長度,在這個例子裡面這個長度對我們來說一點用都沒有,但如果放任它不管的話,瀏覽器就可能會跳轉到一個幾乎為空白的指令碼結果頁面,只顯示push的傳回值,比方說“3”。
因此需要用一個void運算子來“欺騙”瀏覽器:這裡啥都沒有。
現在把目光回到對“未定義”的使用上,就會發現前面我們用來同“未定義”比較的“高容錯性”的typeof運算子,用起來有點麻煩:總共需要多寫“typeof()""”這樣10個字元。
雖然我們是成天跟麻煩打交道的程式員,但這也不能說明我們不該想辦法減少麻煩啊~各種開發工具其實不都是為了把編程工作變得簡單才出現的嗎?
所以說如果明確知道一個變數一定一定絕對絕對已經聲明過,就可以把這個變數直接和已知的“未定義”相比較,比方說這樣: 複製代碼 代碼如下:output(myVar === void(0));

相比於使用typeof運算子,後面這個辦法除了少打幾個字元,還有一些好處:可以避免難以察覺的拼字錯誤(比方說把“undefined”寫成“undefinied”什麼的) 。

到這裡,最常見的關於“undefined”/“未定義”的技巧,已經介紹完了。
在下一篇裡面,我會介紹另一些不太常見的技巧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.