目錄
1.為什要遵守代碼規范
2.編寫代碼需遵守的幾個原則
3.編碼規范(Coding Conventions)
4.命名規范(Naming Conventions)
5.css基礎class類
1.為什要遵守代碼規范軟件bug的修復是昂貴的,并且隨著時間的推移,這些bug的成本也會增加,尤其當這些bug潛伏并慢慢出現在已經發布的軟件中時。當你發現bug 的時候就立即修復它是最好的,此時你代碼要解決的問題在你腦中還是很清晰的。否則,你轉移到其他任務,忘了那個特定的代碼,一段時間后再去查看這些代碼就 需要:
花時間學習和理解這個問題
花時間是了解應該解決的問題代碼
還有問題,特別對于大的項目或是公司,修復bug的這位伙計不是寫代碼的那個人(且發現bug和修復bug的不是同一個人)。因此,必須降低理解代 碼花費的時間,無論是一段時間前你自己寫的代碼還是團隊中的其他成員寫的代碼。這關系到底線(營業收入)和開發人員的幸福,因為我們更應該去開發新的激動 人心的事物而不是花幾小時幾天的時間去維護遺留代碼。
另一個相關軟件開發生命的事實是,讀代碼花費的時間要比寫來得多。有時候,當你專注并深入思考某個問題的時候,你可以坐下來,一個下午寫大量的代碼。
你的代碼很能很快就工作了,但是,隨著應用的成熟,還會有很多其他的事情發生,這就要求你的進行進行審查,修改,和調整。例如:
bug是暴露的
新功能被添加到應用程序
程序在新的環境下工作(例如,市場上出現新想瀏覽器)
代碼改變用途
代碼得完全從頭重新,或移植到另一個架構上或者甚至使用另一種語言
由于這些變化,很少人力數小時寫的代碼最終演變成花數周來閱讀這些代碼。這就是為什么創建可維護的代碼對應用程序的成功至關重要。
可維護的代碼意味著:
可讀的
一致的
可預測的
看上去就像是同一個人寫的
已記錄
2.編寫代碼需遵守的幾個原則提示: 不遵守這些原則代碼也能運行起來。只是可能出現難以維護的現象。規范就像一種模式,大家按照一種模式來,那么閱讀其他人的代碼,成本就降低了。
編寫代碼注意事項: 2.1. 盡量減少聲明全局變量 2.2. 定義變量是,盡量放到頂部function func() { var a = 1, b = 2, sum = a + b, myobject = {}, i, j; // function body... }
注意:在es6中,使用let 定義,可能出現"暫時性死區", 具體想知道什么叫做"暫時性死區" , 請查看阮一峰 ECMAScript 6 入門
2.3.for循環(for Loops)// 次佳的循環 for (var i = 0; i < myarray.length; i++) { // 使用myarray[i]做點什么 } //更好的方式 for (var i = 0, max = myarray.length; i < max; i++) { // 使用myarray[i]做點什么 }
**JSLint提示您這樣做,原因是++和–-促進了“過分棘手(excessive trickiness)”。//zxx:這里比較難翻譯,我想本意應該是讓代碼變得更加的棘手
如果你直接無視它,JSLint的plusplus選項會是false(默認是default)。**
還有兩種變化的形式,其又有了些微改進,因為:
少了一個變量(無max)
向下數到0,通常更快,因為和0做比較要比和數組長度或是其他不是0的東西作比較更有效率
//第一種變化的形式:
var i, myarray = [];
for (i = myarray.length; i–-;) {
// 使用myarray[i]做點什么
}
//第二種使用while循環:
var myarray = [],
i = myarray.length;
while (i–-) {
// 使用myarray[i]做點什么
}
面兩種情況優于前面兩種情況。
2.4.for-in循環(for-in Loops)for-in循環應該用在非數組對象的遍歷上,使用for-in進行循環也被稱為“枚舉”。
從技術上將,你可以使用for-in循環數組(因為JavaScript中數組也是對象),但這是不推薦的。因為如果數組對象已被自定義的功能增強,就可能發生邏輯錯誤。另外,在for-in中,屬性列表的順序(序列)是不能保證的。所以最好數組使用正常的for循環,對象使用for-in循環。
有個很重要的hasOwnProperty()方法,當遍歷對象屬性的時候可以過濾掉從原型鏈上下來的屬性
// 對象 var man = { hands: 2, legs: 2, heads: 1 }; // 在代碼的某個地方 // 一個方法添加給了所有對象 if (typeof Object.prototype.clone === "undefined") { Object.prototype.clone = function () {}; } ==================================================================== // for-in 循環 for (var i in man) { if (man.hasOwnProperty(i)) { // 過濾 console.log(i, ":", man[i]); } } /* 控制臺顯示結果 hands : 2 legs : 2 heads : 1 */ ========================================================================== // 反面例子: // for-in loop without checking hasOwnProperty() for (var i in man) { console.log(i, ":", man[i]); } /* 控制臺顯示結果 hands : 2 legs : 2 heads : 1 clone: function() */2.5.(不)擴展內置原型((Not) Augmenting Built-in Prototypes)
增加內置的構造函數原型(如Object(), Array(), 或Function())挺誘人的,但是這嚴重降低了可維護性,因為它讓你的代碼變得難以預測。使用你代碼的其他開發人員很可能更期望使用內置的 JavaScript方法來持續不斷地工作,而不是你另加的方法。
因此,不增加內置原型是最好的。你可以指定一個規則,僅當下面的條件均滿足時例外:
可以預期將來的ECMAScript版本或是JavaScript實現將一直將此功能當作內置方法來實現。例如,- 你可以添加ECMAScript 5中描述的方法,一直到各個瀏覽器都迎頭趕上。這種情況下,你只是提前定義了有用的方法。
如果您檢查您的自定義屬性或方法已不存在——也許已經在代碼的其他地方實現或已經是你支持的瀏覽器JavaScript引擎部分。
你清楚地文檔記錄并和團隊交流了變化。
if (typeof Object.protoype.myMethod !== "function") { Object.protoype.myMethod = function () { // 實現... }; }
一般情況下,強烈不建議使用
2.6.避免隱式類型轉換(Avoiding Implied Typecasting )JavaScript的變量在比較的時候會隱式類型轉換。這就是為什么一些諸如:false == 0 或 “” == 0 返回的結果是true。為避免引起混亂的隱含類型轉換,在你比較值和表達式類型的時候始終使用===和!==操作符。
var zero = 0; if (zero === false) { // 不執行,因為zero為0, 而不是false } // 反面示例 if (zero == false) { // 執行了... }2.7. 避免(Avoiding) eval()
如果你現在的代碼中使用了eval(),記住該咒語“eval()是魔鬼”。此方法接受任意的字符串,并當作JavaScript代碼來處理。當有 問題的代碼是事先知道的(不是運行時確定的),沒有理由使用eval()。如果代碼是在運行時動態生成,有一個更好的方式不使用eval而達到同樣的目 標。例如,用方括號表示法來訪問動態屬性會更好更簡單:
// 反面示例 var property = "name"; alert(eval("obj." + property)); // 更好的 var property = "name"; alert(obj[property]);3.編碼規范 3.1 縮進(Indentation)
代碼沒有縮進基本上就不能讀了。唯一糟糕的事情就是不一致的縮進,因為它看上去像是遵循了規范,但是可能一路上伴隨著混亂和驚奇。重要的是規范地使用縮進。
一些開發人員更喜歡用tab制表符縮進,因為任何人都可以調整他們的編輯器以自己喜歡的空格數來顯示Tab。有些人喜歡空格——通常四個,這都無所謂,只要團隊每個人都遵循同一個規范就好了。這本書,例如,使用四個空格縮進,這也是JSLint中默認的縮進。
什么應該縮進呢?規則很簡單——花括號里面的東西。這就意味著函數體,循環 (do, while, for, for-in),if,switch,以及對象字面量中的對象屬性。下面的代碼就是使用縮進的示例:
function outer(a, b) { var c = 1, d = 2, inner; if (a > b) { inner = function () { return { r: c - d }; }; } else { inner = function () { return { r: c + d }; }; } return inner; }3.2 花括號{}(Curly Braces)
// 糟糕的實例 for (var i = 0; i < 10; i += 1) alert(i); // 好的實例 for (var i = 0; i < 10; i += 1) { alert(i); }3.3 左花括號的位置(Opening Brace Location)
這個實例中,仁者見仁智者見智,但也有個案,括號位置不同會有不同的行為表現。這是因為分號插入機制(semicolon insertion mechanism)——JavaScript是不挑剔的,當你選擇不使用分號結束一行代碼時JavaScript會自己幫你補上。這種行為可能會導致麻 煩,如當你返回對象字面量,而左括號卻在下一行的時候
// 警告: 意外的返回值 function func() { return // 下面代碼不執行 { name : "Batman" } } // 警告: 意外的返回值 function func() { return undefined; // 下面代碼不執行 { name : "Batman" } }3.4 空格(White Space)
空格的使用同樣有助于改善代碼的可讀性和一致性。在寫英文句子的時候,在逗號和句號后面會使用間隔。在JavaScript中,你可以按照同樣的邏輯在列表模樣表達式(相當于逗號)和結束語句(相對于完成了“想法”)后面添加間隔。
適合使用空格的地方包括:
for循環分號分開后的的部分:如for (var i = 0; i < 10; i += 1) {...}
for循環中初始化的多變量(i和max):for (var i = 0, max = 10; i < max; i += 1) {...}
分隔數組項的逗號的后面:var a = [1, 2, 3];
對象屬性逗號的后面以及分隔屬性名和屬性值的冒號的后面:var o = {a: 1, b: 2};
限定函數參數:myFunc(a, b, c)
函數聲明的花括號的前面:function myFunc() {}
匿名函數表達式function的后面:var myFunc = function () {};
使用空格分開所有的操作符和操作對象是另一個不錯的使用,這意味著在+, -, *, =, <, >, <=, >=, ===, !==, &&, ||, +=等前后都需要空格。
// 寬松一致的間距 // 使代碼更易讀 // 使得更加“透氣” var d = 0, a = b + 1; if (a && b && c) { d = a % c; a += d; } // 反面例子 // 缺失或間距不一 // 使代碼變得疑惑 var d = 0, a = b + 1; if (a&&b&&c) { d=a % c; a+= d; }
最后需要注意的一個空格——花括號間距。最好使用空格:
函數、if-else語句、循環、對象字面量的左花括號的前面({)
else或while之間的右花括號(})
//{} 空格
if (4) {
console.log(1)
} else if (3) {
console.log(1)
}
var a = {}
另一種方法讓你的代碼更具可預測性和可維護性是采用命名規范。這就意味著你需要用同一種形式給你的變量和函數命名。
下面是建議的一些命名規范,你可以原樣采用,也可以根據自己的喜好作調整。同樣,遵循規范要比規范是什么更重要。
4.1以大寫字母寫構造函數(Capitalizing Constructors)JavaScript并沒有類,但有new調用的構造函數:
var adam = new Person();
因為構造函數仍僅僅是函數,僅看函數名就可以幫助告訴你這應該是一個構造函數還是一個正常的函數。
命名構造函數時首字母大寫具有暗示作用,使用小寫命名的函數和方法不應該使用new調用:
function MyConstructor() {...} function myFunction() {...}、4.2 分隔單詞(Separating Words)
當你的變量或是函數名有多個單詞的時候,最好單詞的分離遵循統一的規范,有一個常見的做法被稱作“駝峰(Camel)命名法”,就是單詞小寫,每個單詞的首字母大寫。
對于構造函數,可以使用大駝峰式命名法(upper camel case),如MyConstructor()。
對于函數和方法名稱,你可以使用小駝峰式命名法(lower camel case),像是myFunction(), calculateArea()和getFirstName()。
## 4.3 注釋(Writing Comments)
你必須注釋你的代碼,即使不會有其他人向你一樣接觸它。通常,當你深入研究一個問題,你會很清楚的知道這個代碼是干嘛用的,但是,當你一周之后再回來看的時候,想必也要耗掉不少腦細胞去搞明白到底怎么工作的。5.css代碼規范很顯然,注釋不能走極端:每個多帶帶變量或是多帶帶一行。但是,你通常應該記錄所有的函數,它們的參數和返回值,或是任何不尋常的技術和方法。要想到注 釋可以給你代碼未來的閱讀者以諸多提示;閱讀者需要的是(不要讀太多的東西)僅注釋和函數屬性名來理解你的代碼。例如,當你有五六行程序執行特定的任務, 如果你提供了一行代碼目的以及為什么在這里的描述的話,閱讀者就可以直接跳過這段細節。沒有硬性規定注釋代碼比,代碼的某些部分(如正則表達式)可能注釋 要比代碼多。
css規范我們偉大的張旭鑫老師,講的很清楚。面向屬性的命名
這是比較好的命名規范。簡介來說,就是我們先定義好一些常用基礎類樣式。組件則使用less,或者sass進行組裝,形成即可。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93987.html
摘要:它就是一套兼容方案,目前兼容的有以及原生支持。返回值問題在第一次使用時,。具體是什么意義呢的返回值,其實就是插件提供的對外接口,而實際上,就是一個對象。而在環境下,只需要將這個返回值賦予即可完成該模塊的接口。 有更新,請到github上看源碼 什么是OMD 在node.js流行起來之前,javascript的開發方式都是函數式的順序依賴關系,直到node火起來。CommonJS其實首先...
摘要:另一方面,我不建議初次接觸的開發人員閱讀規范。在維護語言的最新規范。在這一點上,我想指出的是,絕對沒有人從上到下閱讀規范。拓展閱讀由于的定義,中的細節如冒泡錯誤,直到塊在規范中不存在。換句話說,會轉發中拋出的錯誤,并終止其余的步驟。 翻譯自:How to Read the ECMAScript Specification Ecmascript 語言規范 The ECMAScr...
摘要:所有依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成之后,這個回調函數才會運行。也采用語句加載模塊,但是不同于,它要求兩個參數第一個參數,是一個數組,里面的成員就是要加載的模塊第二個參數,則是加載成功之后的回調函數。 本篇文章來自對文章《js模塊化編程之徹底弄懂CommonJS和AMD/CMD!》的總結,大部分摘自文章原話,本人只是為了學習方便做的筆記,之后有新的體會會及時補充...
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...
摘要:執行函數調用規范中的第一步是一個明顯的賦值語句,我們查看規范,賦值語句會發生什么可以看出簡單賦值語句返回的是對等于號右邊進行之后的結果,上一節講了,執行過就會返回的類型,此處會返回也就是一個類型。 前言 this是JavaScript中的著名月經題,每隔一段時間就有人翻出了拿各種奇怪的問題出來討論,每次都會引發一堆口水之爭。從搜索引擎搜了一下現在的比較熱門的關于this的用法,如:Ja...
閱讀 837·2021-11-18 10:07
閱讀 2355·2021-10-14 09:42
閱讀 5315·2021-09-22 15:45
閱讀 585·2021-09-03 10:29
閱讀 3462·2021-08-31 14:28
閱讀 1873·2019-08-30 15:56
閱讀 3038·2019-08-30 15:54
閱讀 994·2019-08-29 11:32