如何寫好你的JavaScript【推薦】
前言
在實(shí)際工作中,我們應(yīng)該經(jīng)常會看到一些功能上沒有問題,但編碼風(fēng)格和規(guī)范卻十分糟糕的代碼,這往往會讓人不敢再往下閱讀,甚至?xí)绊戦喿x者一天的心情。這些代碼不僅不易閱讀,而且難以維護(hù),它們一般會出自剛?cè)腴T的編程新手,也會出自工作了好幾年的老程序員手下。因此本文的目的在于幫助那些沒有養(yǎng)成良好的編碼風(fēng)格,缺乏相應(yīng)編碼規(guī)范意識的JavaScript學(xué)習(xí)者們改善他們的編碼形象。
編碼形象
以上我提出了編碼形象的概念,我個(gè)人認(rèn)為:
編碼形象 = 編碼風(fēng)格 + 編碼規(guī)范
一個(gè)良好的編碼形象就等于一個(gè)穿著得體的青年,對于程序員來說這是同行了解你優(yōu)秀能力的最直接最簡單的方式。
我們來看一下一段糟糕的編碼形象:
//打個(gè)招呼 function func(){ var age=18,sex='man'; var greeting='hello'; if(age<=18&&sex=='man'){ console.log(greeting+'little boy') } ... } func()
上方代碼整體縮在了一起,缺乏規(guī)范意識,閱讀體驗(yàn)很差,不忍直視。
再來看一段良好的代碼形象:
// 打個(gè)招呼 function greetFn() { var age = 18, sex = 'man', greeting = 'hello'; if (age <= 18 && sex === 'man') { console.log(greeting + 'little boy'); } ... }; greetFn();
上方的代碼是不是感覺舒服多了?
由此可見養(yǎng)成一個(gè)良好的編碼形象是至關(guān)重要的,而本文主要講解的是基于JavaScript的編碼形象,即基于JavaScript的編碼風(fēng)格和編碼規(guī)范。
那么什么是編碼風(fēng)格,什么是編碼規(guī)范,兩者的區(qū)別又是什么?
編碼風(fēng)格
首先編碼風(fēng)格既然是風(fēng)格,就沒有對錯(cuò)之分。就好比每個(gè)人的穿著打扮不同,有的人穿的比較得體,有的人穿的比較隨意而已。
而在JavaScript編碼風(fēng)格中,也有一套比較得體的風(fēng)格,尤其在團(tuán)隊(duì)開發(fā)中,我們不能隨意的書寫屬于自己的風(fēng)格。
下面就列舉幾種隨意的編碼風(fēng)格,并將其與良好的編碼風(fēng)格進(jìn)行對比。
1.合理注釋
// 不推薦的寫法 var name = '勞卜';//代碼和注釋之間沒有間隔 if (name) { /* *注釋之前無空行 *星號后面無空格 */ }
// 推薦的寫法 var name = '勞卜'; // 代碼和注釋之間有間隔 if (name) { /* * 注釋之前有空行 * 星號后面有空格 */ }
2.合理間隔
// 不推薦的寫法 var name='勞卜'; // 等號和兩側(cè)之間沒有間隔 // if塊級語句間沒有間隔 if(name){ console.log('hello'); }
// 推薦的寫法 var name = '勞卜'; // 等號和兩側(cè)之間有間隔 // if塊級語句間有間隔 if (name) { console.log('hello'); }
3.合理縮進(jìn)
// 不推薦的寫法:沒有合理縮進(jìn) function getName() { console.log('勞卜'); }
// 推薦的寫法:合理縮進(jìn) function getName() { console.log('勞卜'); }
4.合理空行
// 不推薦的寫法: 代碼功能塊之間沒有空行 function getName() { var name = '勞卜'; if (name) { console.log('hello'); } }
// 推薦的寫法:代碼功能塊之間有空行 function getName() { var name = '勞卜'; if (name) { console.log('hello'); } }
5.合理命名
// 不推薦的寫法 var getName = '勞卜'; // 變量命名前綴為動詞 // 函數(shù)命名前綴為名詞 function name() { console.log('hello'); }
// 推薦的寫法 var name = '勞卜'; // 變量命名前綴為名詞 // 函數(shù)命名前綴為動詞 function getName() { console.log('hello'); }
6.合理聲明
// 不推薦的寫法:函數(shù)在聲明之前使用 getName(); function getName() { console.log('hello'); }
// 推薦的寫法:函數(shù)在聲明之后使用 function getName() { console.log('hello'); } getName();
7.合理結(jié)尾
// 不推薦的寫法:沒有使用分號結(jié)尾 var name = '勞卜' var getName = function() { console.log('hello') }
// 推薦的寫法:使用分號結(jié)尾 var name = '勞卜'; var getName = function() { console.log('hello'); };
以上主要列舉了7個(gè)比較常見的編碼風(fēng)格的例子進(jìn)行了比較,在推薦的寫法和不推薦的寫法中兩者并沒有對錯(cuò)之分,只是推薦的寫法相比較而言更容易閱讀和維護(hù),更適用于團(tuán)隊(duì)開發(fā),也是良好編碼形象的體現(xiàn)。
編碼規(guī)范
對于編碼規(guī)范,既然是規(guī)范,那我們就應(yīng)該按照一定的規(guī)則來編寫。隨意編寫違反編碼規(guī)范的代碼,可能會導(dǎo)致程序的出錯(cuò)和潛在的bug,因此其相對于編碼風(fēng)格來說應(yīng)該更加嚴(yán)謹(jǐn),也有人會把編碼風(fēng)格包含在編碼規(guī)范之中。
下面就列舉幾個(gè)常見的實(shí)例代碼:
1.比較參數(shù)
// 不推薦的寫法:==和!=比較時(shí)會進(jìn)行類型轉(zhuǎn)換,應(yīng)盡量避免使用 var num = 123; if (num == '123') { console.log(num); } else if (num != '321') { console.log('321'); }
// 推薦的寫法:使用===和!==來進(jìn)行比較 var num = 123; if (num === '123') { console.log(num); } else if (num !== '321') { console.log('321'); }
2.包裹if語句
// 不推薦的寫法:if語句不用大話號包裹會出現(xiàn)潛在bug var num = 123; if (num === '123') console.log(num);
// 推薦的寫法:if語句用大話號包裹 var num = 123; if (num === '123') { console.log(num); }
3.慎用eval
// 不推薦的寫法:應(yīng)避免使用eval,不安全,非常耗性能(一次解析成js語句,一次執(zhí)行) var json = '{"name": "勞卜", "func": alert("hello")}'; eval('(' + json + ')'); // 彈出“hello”
// 推薦的寫法 var json = '{"name": "勞卜", "func": alert("hello")}'; JSON.parse(json); // 校驗(yàn)報(bào)錯(cuò)
4.判斷類型
// 不推薦的寫法:用typeof來判斷構(gòu)造函數(shù)創(chuàng)建的對象 var str = new String('勞卜'); console.log(typeof str); // 'object'
// 推薦的寫法:用instanceof來判斷構(gòu)造函數(shù)創(chuàng)建的對象 var str = new String('勞卜'); console.log(str instanceof String); // true
5.檢測屬性
// 不推薦的寫法:使用undefined和null來檢測一個(gè)屬性是否存在 if (obj['name'] !== undefined) { console.log('name屬性存在'); // 若obj.name為undefined時(shí)則會導(dǎo)致判斷出錯(cuò) } if (obj['name'] !== null) { console.log('name屬性存在'); // 若obj.name為null時(shí)則會導(dǎo)致判斷出錯(cuò) }
// 推薦的寫法:使用in運(yùn)算符來檢測對象屬性是否存在,使用hasOwnProperty方法來檢測不包含原型鏈上的對象屬性是否存在 if ('name' in obj) { console.log('name屬性存在'); } if (obj.hasOwnProperty('name')) { console.log('name屬性存在'); }
以上主要列舉了5個(gè)常見的編碼規(guī)范的例子,合理地規(guī)范自己的代碼能夠很大程度上減少不必要的維護(hù)成本和潛在的bug風(fēng)險(xiǎn),對于JavaScript學(xué)習(xí)者來說應(yīng)該銘記于心。
結(jié)語
“程序是寫給人讀的,只是偶爾讓計(jì)算機(jī)執(zhí)行一下?!蔽覀儾荒転榱素潏D一時(shí)的方便而親手毀了自己的代碼形象,這會給他人和整個(gè)項(xiàng)目帶來不必要的麻煩。
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
基于JavaScript實(shí)現(xiàn)年份數(shù)字拼圖效果
時(shí)光荏苒,2022年又要收尾了,公司的年會是不是都安排上了?前幾天看到一個(gè)年會抽獎系統(tǒng),功能十分的強(qiáng)大,其中有一個(gè)年份數(shù)字的拼圖效果深深的吸引了哥,決定用JS實(shí)現(xiàn)一下該效果,需要的可以參考一下2022-12-12詳解js產(chǎn)生對象的3種基本方式(工廠模式,構(gòu)造函數(shù)模式,原型模式)
本篇文章主要介紹了js產(chǎn)生對象的3種基本方式(工廠模式,構(gòu)造函數(shù)模式,原型模式) ,具有一定的參考價(jià)值,有興趣的可以了解一下2017-01-01在table中插入多行,能使用與insertAdjacentHTML相似的功能嗎?
在table中插入多行,能使用與insertAdjacentHTML相似的功能嗎?...2006-12-12javascript 客戶端驗(yàn)證上傳圖片的大?。嫒軮E和火狐)
做web開發(fā)的哥們都會遇到批量上傳圖片的需求,相信大家都會遇到這樣的問題,當(dāng)選擇好要上傳的圖片,提交服務(wù)器后,發(fā)現(xiàn)有圖片的大小超過了系統(tǒng)允許的范圍。2009-08-08javascript中一些數(shù)組常用的API總結(jié)
Js中數(shù)組是一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),它相比于字符串有更多的方法,本篇文章總結(jié)了一些數(shù)組中常用的API,我們把它們分成兩類,一類是會改變原始數(shù)組,一類是不會改變原始數(shù)組,感興趣的小伙伴可以學(xué)習(xí)一下2023-09-09js+html+css實(shí)現(xiàn)簡單電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了js+html+css實(shí)現(xiàn)簡單電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06js中數(shù)組(Array)的排序(sort)注意事項(xiàng)說明
本篇文章主要是對js中數(shù)組(Array)的排序(sort)注意事項(xiàng)進(jìn)行了說明介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01