編寫可維護性的js讀書筆記

第一部分:格式要求
 
1. 4個空格縮進。
2. 行的長度不要超過80個字符,
3. 語句超過的換行4個空格縮進(2個縮進)記住標點符號處不能換到下一行,
4. 定義變量換行則換至等號後
 
5. 添加適當的空行
   * for if每一個流控制語句以前
   * 單行多行註釋
   * 方法之間
   * 方法中局部變量與第一條語句
   * 方法中邏輯片斷添加空行,提升可讀性
 
6. 命名
   * 變量以名詞命名
   * 函數小駝峯命名,以動詞開頭,常見的動詞約定
    * 常量用大寫命名,分割用 _ (下劃線)
    * 構造函數已大駝峯命名
 7. null和undefined
 
 
 
8. 對象直接量

 

 9. 數組直接量

 10. 註釋css

    * 單行註釋有空行,每一個// 之間有一個空格,縮進相同
   * 多行註釋
     
    * 文檔註釋要用/**    **/表示
 
11. 語句與表達式
  1> 塊語句間隔
      
  2> switch語句
       每一個case前加一空行
       若是沒有defalut,添加註釋 // 沒有default ,前面加空行
  3> for循環
      * 避免使用continue(只是退出本次循環迭代),可使用if語句判斷避免使用,避免使用with
      * 普通for循環是對數組進行遍歷
      * for in是循環遍歷對象屬性,並返回屬性名,在自定義中要使用hasOwnProperty()進行判斷,若想查找原型 
         鏈能夠不用判斷可是須要添加註釋說明
 
12. 變量、函數、運算符聲明
  1> 將全部變量聲明到頭部
     
      var語句合併成一句,每一個變量獨佔一行,賦值符號對齊,未初始化變量放在後面
   2> 當即調用函數
       dosomething(item);   不用空格,與塊語句分開
       將匿名函數複製給變量或屬性,用括號括起來
      
    3>嚴格模式 "use strict"
       最好不要全局做用域中
       屢次使用嚴格模式 
       
    4>相等時使用===和!==(最好都是用它)
    5>禁止使用eval(()除了在Json中使用,禁止使用Function構造函數
         setTimeout()和setInterval()禁止傳入字符串,要用匿名函數傳值
    6>儘可能不使用原始包裝類型(Number,String,Boolean),直接使用var a = "ada";
    7>  三元操做符應該用在條件賦值語句中    例如:var a = b ? c : d; //對的    b ? c : d //很差的
 
13. 優化循環 
    1>不從i= 0開始,從最大值開始
    2>使用do while更高效
    3>展開循環,使用Duff或者優化Duff對於大型數據來講
    5>原生方法更快,switch更快,位運算更快
    6>最小化現場更新
        * 建立DOM樹時  *  使用事件代理   * 注意HTMLCollection先使用變量聲明
        * 在狀況對getElementsByTagName()調用時    * 獲取childNodes屬性時
        * 獲取attributes屬性時     * 訪問特殊屬性時,如document.forms,document.images
 

第二部分

 
1. ui層的鬆耦合
   1>將js從css中抽離,在css中禁用expression函數嵌套js語句
   2>將css從js中抽離,將css樣式用類名組裝
   3>將js從html中抽離,在html中添加onclick事件等
   4>將html從js中抽離,使用模板,能夠本身寫一個簡單的模板,也可使用handlebars模板
 
2. 避免使用全局變量 
    1>避免意外的全局變量,在聲明是var a = 1;b = 2;      b爲全局變量了
    2>使用命名空間 var a = {}; a.b = {};  a.c = {} 或使用模塊
 
3. 事件處理
在處理事件時,將應用邏輯隔離(這樣其餘事件能夠進行復用回調函數)而且 在傳參時,不要傳入事件對象event,代碼邏輯不清晰
 
4.檢測類型
   1>檢測基本類型:
     * typeof獨特之處在於 判斷未定義的變量和值爲undefined  都會返回undefined
     * typeof a === ’string’    b === ‘number’      c === ‘boolean’ && c      d === ‘undefined'
   2>引用值:
      * typeof {}   [2, 3]   new Date()  new RegExp()  都爲object
      * null:也爲   object
      * function :返回function
   3>檢測引用值(檢測引用值使用instanceof)
       * value instanceof Object     value instanceof Array   value instanceof Date 
          value instanceof RegExp   value instanceof Error
        * instanceof不只只檢測構造這個對象的構造器,還檢測他的原型鏈
           var a = new Date();
           a instanceof Object  //true   a instance Date  //true
        * 檢測自定義類型,也是惟一的方法
          function Person(name) { this.name = name}      var me = new Person(’nana’);
          me instanceof Object   me instanceof Person //me
        * 缺點:不能跨幀使用
    4>檢測function
         * func instanceof Function //不能跨幀
         * typeof func   //能夠frame可是在ie8以前有限制
            例如: console.log(typeof document.getElementById);  //object
            是由於瀏覽器對DOM的實現由差別,致使將函數識別爲對象,  因此使用
         * if(「querySelectAll」 in document) {}   使用querySelectAll判斷在ie8以後使用,這是最安全的作法
    5>檢測數組;
        js中最古老的跨域問題之一就是在frame之間來回傳遞數組,每一個frame之間都有各自的Array構造函數,所以一個frame的實例在另外的個 frame中沒法識別。因此可使用下面的方法判斷數組
       * Object.prototype.toString.call(value) === 「[Object Array]"
         由於某個值的內置toString()方法都在全部瀏覽器返回標準的字符串結果
       * es5中的 * Array.isArray()
    6>檢測屬性
       * a in obj 
       * obj.hasOwnProperty()
    7>當獲取節點時,若是dom節點不存在則經過document.getElementById()獲得的值爲null,能夠用=== 和!==判斷
 
5. 將配置數據從代碼中分離出來
   對於url,須要展示給用戶的字符串,重複的值,設置(好比每頁的配置項),任何可能發生變動的值均可以將數據抽離出來,也利於後期的維護
 
6. 使用try catch
   try{
        //有些代碼已發了錯誤
   } catch(ex) {
       //處理錯誤
    }
   能夠避免js代碼出錯時,整個程序都不執行,必要的時候能夠進行添加
 
7. 不是你的對象不要動
   1> 不覆蓋方法
       例如:document.getElementById = function() {return null;} //這樣會使js庫以及依賴的方法都失效 
   2> 不新增方法:
        例如:document.a = function() {} Array.prototype.a = function() {} YUI.a = function() {},不要在dom上、原生對象上、以及庫對象上添加方法,會致使命名衝突
   3> 不刪除方法
        例如:document..getElementById = null;
         delete document.getElementById 不受影響,由於document.getElementById()是原型上的一個方法,使用delete沒法刪除
   4>更好的途徑,經過繼承
         * 基於對象的繼承:使用Object.create(),能夠更改原有的方法,一旦已這種方式建立了一個新對象,該新對象就能夠隨意修改
        * 基於類型的繼承:這種方式是經過構造函數實現的而非對象,對於開發者定義了構造函數的狀況下,基於類型的繼承最合適。
        *若是繼承知足不了那就可使用門面模式,用不一樣的接口來包裝已存在的對象,也就是將內容封裝起來
 
8. 阻止修改
   1>防止擴展(禁止添加屬性方法):
       * 使用Object.preventExtension(obj)  ,能夠用Object.isExtensible()進行判斷是否被鎖定
       * 在非嚴格模式下新增方法會悄無生息的添加失敗,嚴格模式下回拋出錯誤
   2>密封(禁止刪除屬性方法):
        * 使用Object.seal(obj)  ,能夠用Object.isSealed(obj)進行判斷是否被密封,規則同上
        * 被密封的對象同時也是不可擴展的,因此調用Object.isExtensible(obj)也是false
   3>凍結(禁止修改屬性方法)
       * 使用Object.freeze(obj)  ,能夠用Object.isFrozen()進行判斷是否被鎖定,規則同上
        * 被凍結的對象同時不可擴展和密封,因此都會返回false
 
9. Jenkins是目前最普遍使用的CI系統之一,一個基於java的web應用程序,用於多個版本的管理,集成了多個源代碼控制庫,Jenkins原生支持Ant和Shell腳本
 
10. 瀏覽器特性檢測
相關文章
相關標籤/搜索