天天看點

《編寫可維護的JavaScript》——1.7 直接量

本節書摘來自異步社群《編寫可維護的javascript》一書中的第1章,第1.7節,作者:【美】nicholas c. zakas著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

javascript中包含一些類型的原始值:字元串、數字、布爾值、null和undefined。同樣也包含對象直接量和數組直接量。這其中,隻有布爾值是自解釋(self-explanatory)的,其他的類型或多或少都需要思考一下它們如何才能更精确地表示出來。

1.7.1 字元串

在javascript中,字元串是獨一無二的。字元串可以用雙引号括起來,也可以用單引号括起來。比如:

和java、php這些語言不同,使用單引号括起字元串和雙引号括起字元串在功能上并無不同。除了内部出現字元串界定符(string delimiter)時需要轉義之外,兩種做法在功效上完全一緻。是以在這段示例代碼中,在使用雙引号括起來的字元串裡需要對雙引号進行轉義,而在使用單引号括起來的字元串裡則不必如此。你需要關心的是,你的代碼應當從頭到尾隻保持一種風格。

crockford的程式設計規範和jquery核心風格指南都使用雙引号來包覆字元串。google的javascript風格指南使用單引号包覆字元串。我傾向于使用雙引号,因為我經常在java和javascript之間來回切換。由于java隻使用雙引号包覆字元串,我發現如果在javascript中也使用這個約定,我會很容易在上下文之間互相切換。這類問題應當在制定規範之初就考慮清楚:這樣可以最大程度地減輕工程師的開發負擔。

關于字元串還有另外一個問題需要注意,即建立多行字元串。這個特性并非來自javascript語言本身,卻在幾乎所有的(javascript)引擎中正常工作。

盡管從技術上講這種寫法是非法的javascript文法,但的确能在代碼中建立多行字元串。通常不推薦使用這種寫法,因為它是一種奇技淫巧而非語言特性,并且在google的javascript風格指南中是明确禁止的。多行字元串的一種替代寫法是,使用字元串連接配接符(+)将字元串分成多份。

1.7.2 數字

在javascript中的數字類型隻有一種,因為所有數字形式—整數和浮點數—都存儲為相同的資料類型。還有一些其他的數字直接量格式來表示不同的資料格式。其中大部分寫法都很好用,但也有一些寫法有問題。

前兩種有問題的寫法分别是省略了小數部分,比如10.,和省略了整數部分,比如.1。每種寫法都有同一個問題:很難搞清楚被省略小數點之前或之後的部分是不小心丢掉了還是刻意為之。很可能是開發者不小心漏掉了。是以為了避免歧義,請不要省略小數點之前或之後的數字。dojo程式設計風格指南明确禁止這兩種寫法。jslint和jshint對這兩種寫法都會給出警告。

最後一個有問題的寫法是八進制數字寫法。長久以來,javascript支援八進制數字寫法是很多錯誤和歧義的根源。數字直接量010不是表示10,而是表示八進制中的8。大多數開發者對八進制格式并不熟悉,也很少用到,是以最好的做法是在代碼中禁止八進制直接量。盡管在所有流行的程式設計規範中沒有關于此的規定,但在jslint和jshint中都會對八進制直接量給出警告。

1.7.3 null

null是一個特殊值,但我們常常誤解它,将它和undefined搞混。在下列場景中應當使用null。

用來初始化一個變量,這個變量可能指派為一個對象。

用來和一個已經初始化的變量比較,這個變量可以是也可以不是一個對象。

當函數的參數期望是對象時,用作參數傳入。

當函數的傳回值期望是對象時,用作傳回值傳出。

還有下面一些場景不應當使用null。

不要使用null來檢測是否傳入了某個參數。

不要用null來檢測一個未初始化的變量。

這裡有一些示例代碼。

了解null最好的方式是将它當做對象的占位符(placeholder)。這個規則在所有的主流程式設計規範中都沒有提及,但對于全局可維護性來說至關重要。

關于null的陷阱會在第8章有更進一步的讨論。

1.7.4 undefined

undefined是一個特殊值,我們常常将它和null搞混。其中一個讓人頗感困惑之處在于null == undefined結果是true。然而,這兩個值的用途卻各不相同。那些沒有被初始化的變量都有一個初始值,即undefined,表示這個變量等待被指派。比如:

盡管這段代碼能正常工作,但我建議避免在代碼中使用undefined。這個值常常和傳回“undefined”的typeof運算符混淆。事實上,typeof的行為也很讓人費解,因為不管是值是undefined的變量還是未聲明的變量,typeof運算結果都是“undefined”。比如:

在這段代碼中,person和foo都會導緻typeof傳回“undefined”,哪怕person和foo在其他場景中的行為有天壤之别(在語句中使用foo會報錯,而使用person則不會報錯)。

通過禁止使用特殊值undefined,可以有效地確定隻在一種情況下typeof才會傳回“undefined”:當變量未聲明時。如果你使用了一個可能(或可能不會)指派為一個對象的變量時,則将其指派為null。

将變量初始值指派為 null 表明了這個變量的意圖,它最終很可能指派為對象。typeof運算符運算null的類型時傳回“object”,這樣就可以和undefined區分開了。

1.7.5 對象直接量

建立對象最流行的一種做法是使用對象直接量,在直接量中直接寫出所有屬性,這種方式可以取代先顯式地建立object的執行個體然後添加屬性的這種做法。比如,我們很少見到下面這種寫法。

對象直接量允許你将所有的屬性都括在一對花括号内。直接量可以高效地完成非直接量寫法相同的任務,非直接量寫法文法看起來更複雜。

當定義對象直接量時,常常在第一行包含左花括号,每一個屬性的名值對都獨占一行,并保持一個縮進,最後右花括号也獨占一行。比如:

這種寫法在開源javascript代碼中能經常看到。盡管沒有歸納入文檔中,google的javascript風格指南非常推薦使用這種寫法。crockford的程式設計規範也推薦使用直接量代替object構造函數,但并沒有給出具體的書寫格式。

1.7.6 數組直接量

和對象直接量類似,數組直接量是javascript中定義數組最簡潔的一種方式。不贊成顯式地使用array構造函數來建立數組,比如: