JavaScript代碼規範

JavaScript代碼規範

1.為什要遵守代碼規範

軟件bug的修復是昂貴的,並且隨著時間的推移,這些bug的成本也會增加,尤其當這些bug潛伏並慢慢出現在已經發布的軟件中時。當你發現bug的時候就立即修復它是最好的,此時你代碼要解決的問題在你腦中還是很清晰的。否則,你轉移到其他任務,忘了那個特定的代碼,一段時間後再去查看這些代碼就需要:

  • 花時間學習和理解這個問題
  • 花時間是瞭解應該解決的問題代碼
  • 還有問題,特別對於大的項目或是公司,修復bug的這位夥計不是寫代碼的那個人(且發現bug和修復bug的不是同一個人)。因此,必須降低理解代碼花費的時間,無論是一段時間前你自己寫的代碼還是團隊中的其他成員寫的代碼。這關係到底線(營業收入)和開發人員的幸福,因為我們更應該去開發新的激動人心的事物而不是花幾小時幾天的時間去維護遺留代碼。

另一個相關軟件開發生命的事實是,讀代碼花費的時間要比寫來得多。有時候,當你專注並深入思考某個問題的時候,你可以坐下來,一個下午寫大量的代碼。

你的代碼很能很快就工作了,但是,隨著應用的成熟,還會有很多其他的事情發生,這就要求你的進行進行審查,修改,和調整。例如:

  • bug是暴露的
  • 新功能被添加到應用程序
  • 程序在新的環境下工作(例如,市場上出現新想瀏覽器)
  • 代碼改變用途
  • 代碼得完全從頭重新,或移植到另一個架構上或者甚至使用另一種語言

由於這些變化,很少人力數小時寫的代碼最終演變成花數週來閱讀這些代碼。這就是為什麼創建可維護的代碼對應用程序的成功至關重要。

可維護的代碼意味著:

  • 可讀的
  • 一致的
  • 可預測的
  • 看上去就像是同一個人寫的
  • 已記錄

2.編寫代碼需遵守的幾個原則

提示:不遵守這些原則代碼也能運行起來。只是可能出現難以維護的現象。規範就像一種模式,大家按照一種模式來,那麼閱讀其他人的代碼,成本就降低了。

編寫代碼注意事項:

2.2.定義變量是,儘量放到頂部

JavaScript代碼規範

注意:在es6中,使用let定義,可能出現’暫時性死區’,具體想知道什麼叫做’暫時性死區’,請查看阮一峰《ECMAScript6 》入門

2.3.for循環(forLoops)

JavaScript代碼規範

JSLint提示您這樣做,原因是++和–-促進了“過分棘手(excessivetrickiness)”。//zxx:這裡比較難翻譯,我想本意應該是讓代碼變得更加的棘手如果你直接無視它,JSLint的plusplus選項會是false(默認是default)。

還有兩種變化的形式,其又有了些微改進,因為:

少了一個變量(無max)

向下數到0,通常更快,因為和0做比較要比和數組長度或是其他不是0的東西作比較更有效率

//第一種變化的形式:

vari, myarray = [];

for(i = myarray.length; i–-;) {

//使用myarray[i]做點什麼

}//第二種使用while循環:varmyarray = [],

i= myarray.length;

while(i–-) {

//使用myarray[i]做點什麼

}

面兩種情況優於前面兩種情況。

2.4.for-in循環(for-inLoops)

for-in循環應該用在非數組對象的遍歷上,使用for-in進行循環也被稱為“枚舉”。

從技術上將,你可以使用for-in循環數組(因為JavaScript中數組也是對象),但這是不推薦的。因為如果數組對象已被自定義的功能增強,就可能發生邏輯錯誤。另外,在for-in中,屬性列表的順序(序列)是不能保證的。所以最好數組使用正常的for循環,對象使用for-in循環。

有個很重要的hasOwnProperty()方法,當遍歷對象屬性的時候可以過濾掉從原型鏈上下來的屬性

JavaScript代碼規範

JavaScript代碼規範

JavaScript代碼規範

2.5.(不)擴展內置原型((Not)Augmenting Built-in Prototypes)

增加內置的構造函數原型(如Object(),Array(),或Function())挺誘人的,但是這嚴重降低了可維護性,因為它讓你的代碼變得難以預測。使用你代碼的其他開發人員很可能更期望使用內置的JavaScript方法來持續不斷地工作,而不是你另加的方法。

因此,不增加內置原型是最好的。你可以指定一個規則,僅當下面的條件均滿足時例外:

  • 可以預期將來的ECMAScript版本或是JavaScript實現將一直將此功能當作內置方法來實現。例如,-你可以添加ECMAScript5中描述的方法,一直到各個瀏覽器都迎頭趕上。這種情況下,你只是提前定義了有用的方法。
  • 如果您檢查您的自定義屬性或方法已不存在——也許已經在代碼的其他地方實現或已經是你支持的瀏覽器JavaScript引擎部分。
  • 你清楚地文檔記錄並和團隊交流了變化。
JavaScript代碼規範

一般情況下,強烈不建議使用

2.6.避免隱式類型轉換(AvoidingImplied Typecasting )

JavaScript的變量在比較的時候會隱式類型轉換。這就是為什麼一些諸如:false== 0 或“” ==0 返回的結果是true。為避免引起混亂的隱含類型轉換,在你比較值和表達式類型的時候始終使用===和!==操作符。

JavaScript代碼規範

2.7.避免(Avoiding)eval()

如果你現在的代碼中使用了eval(),記住該咒語“eval()是魔鬼”。此方法接受任意的字符串,並當作JavaScript代碼來處理。當有問題的代碼是事先知道的(不是運行時確定的),沒有理由使用eval()。如果代碼是在運行時動態生成,有一個更好的方式不使用eval而達到同樣的目標。例如,用方括號表示法來訪問動態屬性會更好更簡單:

JavaScript代碼規範

3.編碼規範

3.1縮進(Indentation)

代碼沒有縮進基本上就不能讀了。唯一糟糕的事情就是不一致的縮進,因為它看上去像是遵循了規範,但是可能一路上伴隨著混亂和驚奇。重要的是規範地使用縮進。

一些開發人員更喜歡用tab製表符縮進,因為任何人都可以調整他們的編輯器以自己喜歡的空格數來顯示Tab。有些人喜歡空格——通常四個,這都無所謂,只要團隊每個人都遵循同一個規範就好了。這本書,例如,使用四個空格縮進,這也是JSLint中默認的縮進。

什麼應該縮進呢?規則很簡單——花括號裡面的東西。這就意味著函數體,循環(do,while, for, for-in),if,switch,以及對象字面量中的對象屬性。下面的代碼就是使用縮進的示例:

JavaScript代碼規範

3.2花括號{}(CurlyBraces)

//糟糕的實例for(vari =0;i <10;i +=1)

alert(i);//好的實例for(vari =0;i <10;i +=1){

alert(i);}

3.3左花括號的位置(OpeningBrace Location)

這個實例中,仁者見仁智者見智,但也有個案,括號位置不同會有不同的行為表現。這是因為分號插入機制(semicoloninsertionmechanism)——JavaScript是不挑剔的,當你選擇不使用分號結束一行代碼時JavaScript會自己幫你補上。這種行為可能會導致麻煩,如當你返回對象字面量,而左括號卻在下一行的時候

JavaScript代碼規範

3.4空格(WhiteSpace)

空格的使用同樣有助於改善代碼的可讀性和一致性。在寫英文句子的時候,在逗號和句號後面會使用間隔。在JavaScript中,你可以按照同樣的邏輯在列表模樣表達式(相當於逗號)和結束語句(相對於完成了“想法”)後面添加間隔。

適合使用空格的地方包括:

  • for循環分號分開後的的部分:如for(var i = 0; i < 10; i += 1) {…}
  • for循環中初始化的多變量(i和max):for(var i = 0, max = 10; i < max; i += 1) {…}
  • 分隔數組項的逗號的後面:vara = [1, 2, 3];
  • 對象屬性逗號的後面以及分隔屬性名和屬性值的冒號的後面:varo = {a: 1, b: 2};
  • 限定函數參數:myFunc(a,b, c)
  • 函數聲明的花括號的前面:functionmyFunc() {}
  • 匿名函數表達式function的後面:varmyFunc = function () {};

使用空格分開所有的操作符和操作對象是另一個不錯的使用,這意味著在+,-, *, =, , <=, >=, ===, !==, &&, ||,+=等前後都需要空格。

JavaScript代碼規範

最後需要注意的一個空格——花括號間距。最好使用空格:

  • 函數、if-else語句、循環、對象字面量的左花括號的前面({)
  • else或while之間的右花括號(})//{}空格

if(4) {

console.log(1)

}else if (3) {

console.log(1)

}

vara = {}

4.命名規範

  • 另一種方法讓你的代碼更具可預測性和可維護性是採用命名規範。這就意味著你需要用同一種形式給你的變量和函數命名。
  • 下面是建議的一些命名規範,你可以原樣採用,也可以根據自己的喜好作調整。同樣,遵循規範要比規範是什麼更重要。

4.1以大寫字母寫構造函數(CapitalizingConstructors)

JavaScript並沒有類,但有new調用的構造函數:

JavaScript代碼規範

因為構造函數仍僅僅是函數,僅看函數名就可以幫助告訴你這應該是一個構造函數還是一個正常的函數。命名構造函數時首字母大寫具有暗示作用,使用小寫命名的函數和方法不應該使用new調用:

JavaScript代碼規範

4.2分隔單詞(SeparatingWords)

當你的變量或是函數名有多個單詞的時候,最好單詞的分離遵循統一的規範,有一個常見的做法被稱作“駝峰(Camel)命名法”,就是單詞小寫,每個單詞的首字母大寫。

  • 對於構造函數,可以使用大駝峰式命名法(uppercamel case),如MyConstructor()。
  • 對於函數和方法名稱,你可以使用小駝峰式命名法(lowercamel case),像是myFunction(),calculateArea()和getFirstName()。

4.3註釋(WritingComments)

你必須註釋你的代碼,即使不會有其他人向你一樣接觸它。通常,當你深入研究一個問題,你會很清楚的知道這個代碼是幹嘛用的,但是,當你一週之後再回來看的時候,想必也要耗掉不少腦細胞去搞明白到底怎麼工作的。

很顯然,註釋不能走極端:每個單獨變量或是單獨一行。但是,你通常應該記錄所有的函數,它們的參數和返回值,或是任何不尋常的技術和方法。要想到註釋可以給你代碼未來的閱讀者以諸多提示;閱讀者需要的是(不要讀太多的東西)僅註釋和函數屬性名來理解你的代碼。例如,當你有五六行程序執行特定的任務,如果你提供了一行代碼目的以及為什麼在這裡的描述的話,閱讀者就可以直接跳過這段細節。沒有硬性規定註釋代碼比,代碼的某些部分(如正則表達式)可能註釋要比代碼多。

5.css代碼規範

css規範我們偉大的張鑫旭老師,講的很清楚。《面向屬性的命名》

這是比較好的命名規範。簡介來說,就是我們先定義好一些常用基礎類樣式。組件則使用less,或者sass進行組裝,形成即可。

JavaScript代碼規範


分享到:


相關文章: