初識JSLint及由此想到的建議JS編碼風格
可能都或多或少的知道JSLint是一個JavaScript的代碼質量工具,一個JavaScript語法檢查器和校驗器,它能分析JavaScript問題并報告它包含的缺點。
被發現的問題往往是語法錯誤,但也不一定全是,JSLint查看一些代碼風格慣例及結構上的問題。
下面我介紹一些JSLint的常識
未定義的變量和函數
JavaScript最大的問題是對全局變量的依賴,特別是隱式的全局變量。
JSLint期望所有的變量和函數在使用或調用前都已被聲明。通過這種方式來判斷是否為隱式的全局變量,那如果一個JS文件會依賴別處定義的全局變量或函數,你可以在此JS文件包含注釋從而標識給JSLint知識,這個注釋列出所有無需JSLint檢測的全局變量。
/*global GetByNameFn,myObj,myFn*/
注意在g之前沒有空白。
你可以使用任意多個/*global*/注釋,但它們必須出現在指定的變量被使用之前。
成員元素
因為JavaScript是弱類型的動態對象語言,也就是說可以給對象隨時添加任意多個不同類型的屬性,這就導致我們無法在編譯時確定對象的屬性名是否拼寫正確。JSLint用/*members*/來幫忙檢測屬性是否有拼寫錯誤。可以使用/*members*/注釋到你的腳本中,JSLint將會依照該列表來檢查所有屬性名字的拼寫。
/*members doTell,mercySakes,myGoodness,ohGo*/
分號
JSLint期望在除了for,function,if,switch,try和while之外的每個語句后面都跟著分號,但是JSLint并不期望看到不必要的分號
換行
為了讓代碼看起來層次分明,大家都會不自覺的用空行來讓代碼分層,但是JSLint建議你總是在運算符之后換行,因為這樣可避免很多不必要的錯誤。
逗號
大家都知道逗號在JavaScript中既可以用作分隔符也可是是運算符。
但是JSLint期望逗號被用作分隔符而不是運算符(除了在for語句 的初始化和增量兩部分中以外),它不期望看到數組字面量中省略掉一些元素,多余的逗號不應該被使用,比如說不應該在數組字面量或對象字面量的最后一個元素之后出現逗號,因為這樣會被一些瀏覽器錯誤的解析。
必要的代碼塊
JSLint不期望你省略掉代碼塊語句,也就是說建議你即使條件判斷語句中,即使只有一條語句也應該用花括號包圍起來。
變量在作用域最前端聲明
大家都清楚在JavaScript中是沒有塊作用域的,只有函數作用域,而且變量有提升聲明的特性,所以JSLint建議在作用域最前端聲明,最好是使用單語句變量聲明。
for in 語句
for in語句可以用來遍歷對象的所有屬性的名字,但是也會遍歷出所有從原型鏈中繼承而來的成員元素。所以最好用如下代碼所示:
for (var name in object) { if (object.hasOwnProperty(name)) { } }
Switch語句
雖然在JavaScript中在Switch是可以穿透case語句的,但JSLint期望在下一個case或default語句之前有如下語句中的一條:break、return、throw。
var語句
With
雖然在JavaScript中,with語句有時會提供方便,但JSLint不期望看到with語句。
=
JSLint不期望在if或while語句的條件部分看到賦值語句,如果你確實是想要是一個賦值那么把它用括號括起來吧,如下代碼所示:
if ((a=b)) {}</pre></div>
==和!=
==和!=在執行比較前會做強制類型轉換,JSLint推薦使用===和!==來替換==和!=。
如果你希望做強制類型轉換,那么請使用簡易格式。
(foo != 0) (foo)//建議用此簡易方式來實現(foo != 0) (foo == 0) (!foo)//建議用此簡易方式來實現 (foo == 0)標簽
JavaScript允許任何語句都擁有一個標簽,并且標簽有一個單獨的名稱空間,但JSLint期望標簽只會用在與break語句進行交互的下列語句中,如switch while do for等
不可達代碼
JSLint期望return break continue或throw語句后面緊跟一個}
混亂的正負號
JSLint期望+不會跟在+或++的后面,同理-不會跟在-或–的后面,因為一個位置不當的空格將可能使+ +變成++,這樣的錯誤很難被發現,如果非要連接一起使用請用圓括號來避免混淆。
++和–
JSLint建議盡量避免使用++和–,因為這樣會出現糟糕難以理解的代碼。
位運算符
在JavaScript中沒有整數類型,但它有位運算符,位運算符把它們的運算數從浮點轉換為整數后再進行運算,所以在JavaScript中的位運算符效率遠沒有其它語言的高
void
在大多數語言中,void是一種類型,而在JavaScript中,void是一個總是返回undefined的前置運算符,JSLint不期望看到void,因為它令人困惑而且沒什么用。
構造器函數和new運算符位運算符
JSLint強制約定構造器函數必須以首字母大寫的形式命名,JSLint不期望看到一個首字母大寫的函數在沒有new前綴的情況下被調用,JSLint也不期望看到與new 連用的函數名不是以大寫字母開頭。
JSLint不期望看到這些封裝形式:new Number、new String 、new Boolean
JSLint不期望看到new Object(使用對象字面量{}代碼)
JSLint不期望看到new Array(使用數組字面量[]代碼)
JSLint選項
![]()
原文出處: YouYaInsist 的博客
![]()