在實際工做中,咱們應該常常會看到一些功能上沒有問題,但編碼風格和規範卻十分糟糕的代碼,這每每會讓人不敢再往下閱讀,甚至會影響閱讀者一天的心情。這些代碼不只不易閱讀,並且難以維護,它們通常會出自剛入門的編程新手,也會出自工做了好幾年的老程序員手下。所以本文的目的在於幫助那些沒有養成良好的編碼風格,缺少相應編碼規範意識的JavaScript學習者們改善他們的編碼形象。程序員
以上我提出了編碼形象的概念,我我的認爲:編程
編碼形象 = 編碼風格 + 編碼規範
一個良好的編碼形象就等於一個穿着得體的青年,對於程序員來講這是同行瞭解你優秀能力的最直接最簡單的方式。json
咱們來看一下一段糟糕的編碼形象:安全
//打個招呼 function func(){ var age=18,sex='man'; var greeting='hello'; if(age<=18&&sex=='man'){ console.log(greeting+'little boy') } ... } func()
上方代碼總體縮在了一塊兒,缺少規範意識,閱讀體驗不好,不忍直視。微信
再來看一段良好的代碼形象:函數
// 打個招呼 function greetFn() { var age = 18, sex = 'man', greeting = 'hello'; if (age <= 18 && sex === 'man') { console.log(greeting + 'little boy'); } ... }; greetFn();
上方的代碼是否是感受舒服多了?性能
因而可知養成一個良好的編碼形象是相當重要的,而本文主要講解的是基於JavaScript的編碼形象,即基於JavaScript的編碼風格和編碼規範。
那麼什麼是編碼風格,什麼是編碼規範,二者的區別又是什麼?
首先編碼風格既然是風格,就沒有對錯之分。就比如每一個人的穿着打扮不一樣,有的人穿的比較得體,有的人穿的比較隨意而已。
而在JavaScript編碼風格中,也有一套比較得體的風格,尤爲在團隊開發中,咱們不能隨意的書寫屬於本身的風格。
下面就列舉幾種隨意的編碼風格,並將其與良好的編碼風格進行對比。
// 不推薦的寫法 var name = '勞卜';//代碼和註釋之間沒有間隔 if (name) { /* *註釋以前無空行 *星號後面無空格 */ }
// 推薦的寫法 var name = '勞卜'; // 代碼和註釋之間有間隔 if (name) { /* * 註釋以前有空行 * 星號後面有空格 */ }
// 不推薦的寫法 var name='勞卜'; // 等號和兩側之間沒有間隔 // if塊級語句間沒有間隔 if(name){ console.log('hello'); }
// 推薦的寫法 var name = '勞卜'; // 等號和兩側之間有間隔 // if塊級語句間有間隔 if (name) { console.log('hello'); }
// 不推薦的寫法:沒有合理縮進 function getName() { console.log('勞卜'); }
// 推薦的寫法:合理縮進 function getName() { console.log('勞卜'); }
// 不推薦的寫法: 代碼功能塊之間沒有空行 function getName() { var name = '勞卜'; if (name) { console.log('hello'); } }
// 推薦的寫法:代碼功能塊之間有空行 function getName() { var name = '勞卜'; if (name) { console.log('hello'); } }
// 不推薦的寫法 var getName = '勞卜'; // 變量命名前綴爲動詞 // 函數命名前綴爲名詞 function name() { console.log('hello'); }
// 推薦的寫法 var name = '勞卜'; // 變量命名前綴爲名詞 // 函數命名前綴爲動詞 function getName() { console.log('hello'); }
// 不推薦的寫法:函數在聲明以前使用 getName(); function getName() { console.log('hello'); }
// 推薦的寫法:函數在聲明以後使用 function getName() { console.log('hello'); } getName();
// 不推薦的寫法:沒有使用分號結尾 var name = '勞卜' var getName = function() { console.log('hello') }
// 推薦的寫法:使用分號結尾 var name = '勞卜'; var getName = function() { console.log('hello'); };
以上主要列舉了7個比較常見的編碼風格的例子進行了比較,在推薦的寫法和不推薦的寫法中二者並無對錯之分,只是推薦的寫法相比較而言更容易閱讀和維護,更適用於團隊開發,也是良好編碼形象的體現。
對於編碼規範,既然是規範,那咱們就應該按照必定的規則來編寫。隨意編寫違反編碼規範的代碼,可能會致使程序的出錯和潛在的bug,所以其相對於編碼風格來講應該更加嚴謹,也有人會把編碼風格包含在編碼規範之中。
下面就列舉幾個常見的實例代碼:
// 不推薦的寫法:==和!=比較時會進行類型轉換,應儘可能避免使用 var num = 123; if (num == '123') { console.log(num); } else if (num != '321') { console.log('321'); }
// 推薦的寫法:使用===和!==來進行比較 var num = 123; if (num === '123') { console.log(num); } else if (num !== '321') { console.log('321'); }
// 不推薦的寫法:if語句不用大話號包裹會出現潛在bug var num = 123; if (num === '123') console.log(num);
// 推薦的寫法:if語句用大話號包裹 var num = 123; if (num === '123') { console.log(num); }
// 不推薦的寫法:應避免使用eval,不安全,很是耗性能(一次解析成js語句,一次執行) var json = '{"name": "勞卜", "func": alert("hello")}'; eval('(' + json + ')'); // 彈出「hello」
// 推薦的寫法 var json = '{"name": "勞卜", "func": alert("hello")}'; JSON.parse(json); // 校驗報錯
// 不推薦的寫法:用typeof來判斷構造函數建立的對象 var str = new String('勞卜'); console.log(typeof str); // 'object'
// 推薦的寫法:用instanceof來判斷構造函數建立的對象 var str = new String('勞卜'); console.log(str instanceof String); // true
// 不推薦的寫法:使用undefined和null來檢測一個屬性是否存在 if (obj['name'] !== undefined) { console.log('name屬性存在'); // 若obj.name爲undefined時則會致使判斷出錯 } if (obj['name'] !== null) { console.log('name屬性存在'); // 若obj.name爲null時則會致使判斷出錯 }
// 推薦的寫法:使用in運算符來檢測對象屬性是否存在,使用hasOwnProperty方法來檢測不包含原型鏈上的對象屬性是否存在 if ('name' in obj) { console.log('name屬性存在'); } if (obj.hasOwnProperty('name')) { console.log('name屬性存在'); }
以上主要列舉了5個常見的編碼規範的例子,合理地規範本身的代碼可以很大程度上減小沒必要要的維護成本和潛在的bug風險,對於JavaScript學習者來講應該銘記於心。
「程序是寫給人讀的,只是偶爾讓計算機執行一下。」咱們不能爲了貪圖一時的方便而親手毀了本身的代碼形象,這會給他人和整個項目帶來沒必要要的麻煩。
本文內容參考自《編寫可維護的JavaScript》一書。
若是以爲本文對你有幫助,能夠關注個人微信公衆號,來這裏聊點關於前端的事情。