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