1. 程式人生 > >前端編碼規範之JavaScript

前端編碼規範之JavaScript

  上次淺談了下關於CSS的編碼規範,大部分童鞋持贊同意見,仍存在一些童鞋不太理解這些規範的意義。

  如果是個人或者小作坊開發,其實這些所謂的編碼規範也沒啥意思,因為大家寫好的程式碼直接就給扔到網上去了,很少有打包、壓縮、校檢等過程,別人來修改你程式碼的情況也比較少。但是,對於一定規模的團隊來說,這些東西還是挺有必要的!一個是保持程式碼的整潔美觀,同時良好的程式碼編寫格式和註釋方式可以讓後來者很快地瞭解你程式碼的大概思路,提高開發效率。

  那麼這次,繼續拋磚引玉,說說Javascript一些需要引起注意的地方(這些東西也是團隊開發的時候大家集思廣益總結出來的)。

不規範寫法舉例

1. 句尾沒有分號

var isHotel = json.type == "hotel" ? true : false

2. 變數命名各種各樣

var is_hotel;
var isHotel;
var ishotel;

3. if 縮寫

if (isHotel)
    console.log(true)
else
    console.log(false)

4. 使用 eval

var json = eval(jsonText);

5. 變數未定義到處都是

function() {
    var isHotel = 'true';
    .......

    
var html = isHotel ? '<p>hotel</p>' : ""; }

6. 超長函式

function() {
    var isHotel = 'true';
    //....... 此處省略500行
    return false;
}

7. ..........

書寫不規範的程式碼讓我們難以維護,有時候也讓我們頭疼。

(禁止)、(必須)等字眼,在這裡只是表示強調,未嚴格要求

前端規範之JavaScript

 1. tab鍵用(必須)四個空格代替

這個原因已經在前端編碼規範之CSS說過了,不再贅述。

2. 每句程式碼後(必須)

加";"

 這個是要引起注意的,比如:

a = b        // 賦值
(function(){
    //....
})()         // 自執行函式

 未加分號,結果被解析成

a = b(function(){//...})()  //將b()()返回的結果賦值給a

 這是截然不同的兩個結果,所以對於這個問題必須引起重視!!!

3. 變數、常量、類的命名(必須)以下規則執行:

  1) 變數必須採用駱駝峰的命名且首字母小寫

 // 正確的命名
  var isHotel,
      isHotelBeijing,
      isHotelBeijingHandian;

  // 不推薦的命名
  var is_Hotel,
      ishotelbeijing,
      IsHotelBeiJing;

  2) 常量必須採用全大寫的命名,且單詞以_分割,常量通常用於ajax請求url,和一些不會改變的資料

// 正確的命名
  var HOTEL_GET_URL = 'http://map.baidu.com/detail',
      PLACE_TYPE = 'hotel';

  3) 類必須採用駱駝峰的命名且首字母大寫,如:

 // 正確的寫法
  var FooAndToo = function(name) {
      this.name = name;
  }

4. 空格的使用

  1)if中的空格,先上例子

 //正確的寫法
  if (isOk) {
      console.log("ok");
  }

  //不推薦的寫法
  if(isOk){
      console.log("ok");
  }
  • ()中的判斷條件前後都(必須)加空格
  • ()裡的判斷前後(禁止)加空格,如:正確的寫法: if (isOk);不推薦的寫法: if ( isOk )

  2)switch中的空格, 先上例子

//正確的寫法
  switch(name) {
      case "hotel":
          console.log(name);
          break;

      case "moive":
          console.log(name);
          break;

      default:
          // code
  }

  //不推薦的寫法
  switch (name) {                     // switch 後不應該有空格, 正確的寫法: switch(name) { // code
      case "hotel":
          console.log(name);
      break;                          // break; 應該和console.log對齊
      case "movie":                   // 每個case之前需要有換行
          console.log(name);
      break;                          // break; 應該和console.log對齊

      default:
          // code
  }

   3)for中的空格,先上例子

 // 正確的寫法
  var names = ["hotel", "movie"],
      i, len;

  for (i=0, len=names.length; i < len; i++) {
      // code
  }

  // 不推薦的寫法
  var names = ["hotel", "movie"],
      i, len;

  for(i = 0, len = names.length;i < len;i++) {          // for後應該有空格,每個`;`號後需要有空格,變數的賦值不應該有空格
      // code
  }
  • for必須)加空格
  • 每個;必須)加空格
  • ()禁止var宣告變數; 且變數的賦值 前後禁止)加空格

  4)function 中的空格, 先上例子

 // 正確的寫法
  function call(name) {

  }

  var cell = function () {

  };

  // 不推薦的寫法
  var call = function(name){ 
      // code
  }
  • 引數的反括號後必須)加空格
  • function 必須)加空格

  5)var 中空格及定義,先上例子

 // 一個推薦的var寫法組
  function(res) {
      var code = 1 + 1,
          json = JSON.parse(res),
          type, html;

      // code
  }
  • 宣告變數= 前後必須)新增空格
  • 每個變數的賦值宣告以,結束後必須)換行進行下一個變數賦值宣告
  • (推薦)將所有不需要進行賦值的變數宣告放置最後一行,且變數之間不需要換行
  • (推薦)當一組變數宣告完成後,空一行後編寫其餘程式碼

5. 在同一個函式內部,區域性變數的宣告必須置於頂端

因為即使放到中間,js解析器也會提升至頂部(hosting)

 // 正確的書寫
 var clear = function(el) {
     var id = el.id,
         name = el.getAttribute("data-name");

     .........
     return true;
 }

 // 不推薦的書寫
 var clear = function(el) {
     var id = el.id;

     ......

     var name = el.getAttribute("data-name");

     .........
     return true;
 }

6. 塊內函式必須用區域性變數宣告

// 錯誤的寫法
 var call = function(name) {
     if (name == "hotel") {
         function foo() {
             console.log("hotel foo");
         }
     }

     foo && foo();
 }

 // 推薦的寫法
 var call = function(name) {
     var foo;

     if (name == "hotel") {
         foo = function() {
             console.log("hotel foo");
         }
     }

     foo && foo();
 }

引起的bug:第一種寫法foo的宣告被提前了; 呼叫call時:第一種寫法會呼叫foo函式,第二種寫法不會呼叫foo函式

7. 禁止)使用eval,採取$.parseJSON

 三個原因:

  • 注入風險,尤其是ajax返回資料
  • 不方便debug
  • 效率低,eval是一個執行效率很低的函式

建議:

  使用new Function來代替eval的使用,最好就別用。

8. 除了三目運算if,else禁止)簡寫

 // 正確的書寫
 if (true) {
     alert(name);
 }
 console.log(name);
 // 不推薦的書寫
 if (true)
     alert(name);
 console.log(name);
 // 不推薦的書寫
 if (true)
 alert(name);
 console.log(name)

9. 推薦)在需要以{}閉合的程式碼段前增加換行,如:for if

 // 沒有換行,小的程式碼段無法區分
 if (wl && wl.length) {
     for (i = 0, l = wl.length; i < l; ++i) {
         p = wl[i];
         type = Y.Lang.type(r[p]);
         if (s.hasOwnProperty(p)) {
             if (merge && type == 'object') {
                 Y.mix(r[p], s[p]);
             } else if (ov || !(p in r)) {
                 r[p] = s[p];
             }
         }
     }
 }
 // 有了換行,邏輯清楚多了
 if (wl && wl.length) {

     for (i = 0, l = wl.length; i < l; ++i) {
         p = wl[i];
         type = Y.Lang.type(r[p]);

         if (s.hasOwnProperty(p)) {
             // 處理merge邏輯
             if (merge && type == 'object') {
                 Y.mix(r[p], s[p]);
             } else if (ov || !(p in r)) {
                 r[p] = s[p];
             }
         }
     }
 }

換行可以是空行,也可以是註釋

10. 推薦)使用Function進行類的定義,(不推薦)繼承,如需繼承採用成熟的類庫實現繼承

// 類的實現
 function Person(name) {
     this.name = name;
 }

 Person.prototype.sayName = function() {
     alert(this.name);
 };

 var me = new Person("Nicholas");

 // 將this放到區域性變數self
 function Persion(name, sex) {
     var self = this;

     self.name = name;
     self.sex = sex;
 }

 平時咱們寫程式碼,基本都是小程式,真心用不上什麼繼承,而且繼承並不是JS的擅長的語言特性,儘量少用。如果非要使用的話,注意一點:

function A(){
    //...
}
function B(){
    //...
}
B.prototype = new A();
B.prototype.constructor = B; //原則上,記得把這句話加上

 繼承從原則上來講,別改變他的建構函式,否則這個繼承就顯得很彆扭了~ 

11. (推薦)使用區域性變數快取反覆查詢的物件(包括但不限於全域性變數、dom查詢結果、作用域鏈較深的物件)

 // 快取物件
 var getComment = function() {
     var dom = $("#common-container"),               // 快取dom
         appendTo = $.appendTo,                      // 快取全域性變數
         data = this.json.data;                      // 快取作用域鏈較深的物件

 }

12. 當需要快取this時必須使用self變數進行快取

// 快取this
 function Row(name) {
     var self = this;

     self.name = name;
     $(".row").click(function() {
         self.getName();
     });
 }

 self是一個保留字,不過用它也沒關係。在這裡,看個人愛好吧,可以用_this, that, me等這些詞,都行,但是團隊開發的時候統一下比較好。

13. 不推薦)超長函式, 當函式超過100行,就要想想是否能將函式拆為兩個或多個函式

14. 等你來填坑~

小結

  規範是死的,羅列這些東西,目的是為了讓程式猿們對這些東西引起注意,平時寫程式碼的時候注意格式,不僅僅方便了自己,也讓其他閱讀者看得舒服。

可能還有一些點沒有涉及到,如果你有好的建議,請提出來,我們一起打造一個良好的前端生態環境!

相關推薦

前端編碼規範JavaScript

  上次淺談了下關於CSS的編碼規範,大部分童鞋持贊同意見,仍存在一些童鞋不太理解這些規範的意義。   如果是個人或者小作坊開發,其實這些所謂的編碼規範也沒啥意思,因為大家寫好的程式碼直接就給扔到網上去了,很少有打包、壓縮、校檢等過程,別人來修改你程式碼的情況也比較少。但是,對於一定規模的團隊來說,這些東西

前端編碼規範CSS

  "字是門面書是屋",我們不會去手寫程式碼,但是敲出來的程式碼要好看、有條理,這還必須得有一點約束~   團隊開發中,每個人的編碼風格都不盡相同,有時候可能存在很大的差異,為了便於壓縮元件對程式碼進行壓縮以及書寫樣式的規範統一和美觀,很有必要大家一起來研究一套基本規範(模板)!   我先拋磚引玉。(禁止

Airbnb前端規範javascript編碼規範

傳遞 ++ ack ice 必須 轉換 cat eal 快速 1 引用 1.1 對所有的引用使用 const ,不要使用 var。 (這能確保你無法對引用重新賦值,也不會導致出現 bug 或難以理解) // bad var a = 1; var b = 2; /

前端開發規範jQuery編碼規範

前端開發whqet,csdn,王海慶,whqet,前端開發專家翻譯人員:前端開發whqet,意譯為主,不當之處敬請指正。譯者說:臨近期末,大部分的基礎教學內容已經講解完畢,在進行比較大型的專案訓練之前,如果能讓學生了解甚至遵循一些前端開發的編碼規範將會是一件非常有意義的事情。

《從零開始學Swift》學習筆記(Day 57)——Swift編碼規範凝視規範:文件凝視、文檔凝視、代碼凝視、使用地標凝視

精品 -type mil 顯示 clas ber ansi tex text 原創文章。歡迎轉載。轉載請註明:關東升的博客 前面說到Swift凝視的語法有兩種:單行凝視(//)和多行凝視(/*...*/)。這裏來介紹一下他們的使用規範。 1、文件凝視文件凝視就在每個文

前端編碼規範 -- html篇

一個 不可 發的 性能 itl 它的 替代 可用性 樣式 文檔類型 推薦使用 HTML5 的文檔類型申明: <!DOCTYPE html> (建議使用 text/html 格式的 HTML。避免使用 XHTML。XHTML 以及它的屬性,比如 applicati

前端編碼規範 -- 通用篇

好的 空格 lint 重要 body 單詞 分隔符 ges win 前言 本系列意在增強團隊的開發協作,提高代碼質量和打造開發基石的編碼風格規範。 我們知道,當一個團隊開始指定並實行編碼規範的話,錯誤就會變得更加顯而易見。如果一段特定的代碼不符合規範的話,它有可能只是代碼風

前端編碼規範 -- css篇

註釋 lis post css 抽象 避免 lin 合作 節點 合理的避免使用ID 一般情況下ID不應該被應用於樣式。 ID的樣式不能被復用並且每個頁面中你只能使用一次ID。 使用ID唯一有效的是確定網頁或整個站點中的位置。 盡管如此,你應該始終考慮使用class,而不是i

編碼規範命名

1.命名 命名是一個看似簡單卻值得深究的一個過程。變數、函式、檔案等等命名有一些內在的要求:見名知義。一個好的名字可以讓人一眼就知道它是做什麼的,它往往是一個事物的高度概括。如果一個名字取得不好,那麼可能會其他人帶來閱讀上的困難,甚至引起歧義。變數名和檔名一般採用名詞,而函式名一般採用動賓結構。

HTML 編碼規範布林型屬性

布林屬性:     XHTML 規範要求為布林型屬性賦值,到了HTML5,一切化繁為簡。HTML5 規範規定:元素的布林型屬性如果有值,就是 true,如果沒有值,就是 false。因此,在宣告布林型屬性時,不用賦值。   我們可以看到<input

前端讀者 | 百度前端編碼規範(JS)

本文來自:百度FEX 1 前言 JavaScript在百度一直有著廣泛的應用,特別是在瀏覽器端的行為管理。本文件的目標是使JavaScript程式碼風格保持一致,容易被理解和被維護。 雖然本文件是針對JavaScript設計的,但是在使用各種JavaScript的預編譯語言時(如TypeScript等)時

程式設計小技巧(三)-------前端編碼規範

年末了最近在整理檔案,順手寫了一套編碼規範,來源於工作和習慣。雖然程式設計師多不勝數,但是不是每一個程式設計師都寫的一手好程式碼,不論邏輯,單是看上去就沒有讓人讀的慾望。寫程式碼跟寫書寫文件一樣,簡單整潔易明瞭是通用的原則,接觸前端已經四個月,好死不死還是寫了不少的程式碼,爬

前端開發規範命名規範、html規範、css規範、js規範

在學習程式設計的時候,每次看到那些整齊規範的程式碼,心裡頓時對這個程式設計師表示點點好感,有時,比如看到自己和朋友寫的程式碼時,那閱讀起來就是苦不堪言,所以,一些基本的開發規範是必須的,是為了自己方便閱讀程式碼,也方便他人閱讀修改程式碼。 命名

前端開發規範React應用使用ESLint

現代前端技術飛速發展,最終形成了以效率和質量為核心的兩大趨勢。就效率而言,在大型前端專案的開發中,規範的制定、框架的出現與升級、構建的使用更新、元件化的設計實現等都在於前端能更快、更高效地完成更多的事情。質量方面,前端優的提出、前端使用者資料的收集、錯誤日誌的收集上報等,都是為了幫助開發者來提高前端效能,

C#編碼規範代碼的增刪改約定

pre 支持 type cal group 一次 情況 delet 約定 C#編碼規範,代碼的增刪改約定: 增加 #region add by Tome 2018-9-20 //原因:描述 int a = GetScale(obj, col); #endregion

Bootstrap CSS 編碼規範Less 和 Sass 中的巢狀

Less 和 Sass 中的巢狀避免不必要的巢狀。這是因為雖然你可以使用巢狀,但是並不意味著應該使用巢狀。只有在必須將樣式限制在父元素內(也就是後代選擇器),並且存在多個需要巢狀的元素的時候,才使用巢狀。// Without nesting.table > thead

前端開發規範命名規範

HTML: 1.單標記標籤統一加/結尾 2.所有跟資料有關的按鈕都用input 3.定位屬性要寫全,為0不省略 4.給有事件的元素統一加類 5.單獨模組用section包起來,class是模組名 6.導航,footer單獨之外,其餘的儘量用一個大的容

編碼規範 ----JAVA註釋規範

一、前言 好的程式碼規範是一個程式設計師的基本修煉,好的程式碼註釋更能體現一個程式設計師的思維邏輯,雖然程式碼是用來給機器執行的,我們只要能寫出能讓編譯器執行的程式碼就行了,但是如果沒有好的編碼規範,到專案後期,加入開發的人員逐漸增多時,每個人的編碼風格都不

前端編碼規範

沒有 pac 情況 好的 nav none whatwg -type glob 最佳原則 堅持制定好的代碼規範。 無論團隊人數多少,代碼應該同出一門。 命名規則 項目命名 全部采用小寫方式, 以下劃線分隔。 例:my_project_name 目錄命名 參照項目命名規則;

前端效能優化 JavaScript

前言 本文為 《高效能 JavaScript》 讀書筆記,是利用中午休息時間、下班時間以及週末整理出來的,此書雖有點老舊,但談論的效能優化話題是每位同學必須理解和掌握的,業務響應速度直接影響使用者體驗。 一、載入和執行 大多數瀏覽器使用單程序處理 UI 更新和 JavaScript 執行等多個任務,而同一時