JavaScript -- 代碼規范

  1. 使用制表符進行縮進,推薦使用 4 個空格字符作為一個縮進層級。

  2. 建議每條語句以分號結尾,雖然 JavaScript 有自動分號插入(ASI) 機制,但是它的插入規則非常復雜難以記住,所以不推薦省略分號。

  3. 為了代碼的可讀性,建議將一行代碼的長度保持在 80 字符以內。

  4. 當代碼達到了單行最大字符限制時,需要將代碼手動拆成兩行,通常在元算符換行的時候,下一行最好增加兩個層級的縮進。

     callFunction(elementOne, elementTwo, elementThree, elementFour,
             elementFive);
    

而且最好將一個運算符放置到行尾,這樣的話,ASI 就不會自作主張的在行尾添加分號,也就避免了錯誤的發生。當然如果是在給變量賦值的時候換行,那么第二行的位置應當和賦值運算符的位置保持對齊。

        var result = elementOne + elementTwo + elementThree +
                     elementFive;
  1. 合理的使用空行將讓你的代碼更加易于閱讀。在以下場景中添加空行是非常不錯的主意。
    • 在方法之間
    • 在方法中的局部變量和第一條語句之間
    • 在單行或多行注釋之前
    • 在方法的邏輯片段之間

下面是以上原則的實踐。
if (true) {

            for (var i = 0; i < Things.length; i++) {
                var p = 1,
                    q = 2;

                if (true) {
                    
                }
            }
        }
  1. 命名是一門藝術,更是一門技術,通常來講命名長度應當盡可能的短,并且抓住要點。為變量命名時,其前綴應該是名詞。為函數命名時前綴應當是動詞,比如 can, has, is, set, get 等。對于常量的命名,最好使用大寫字母和下劃線的組和來命名,比如說 MAX_LENGTH

  2. null 是一個特殊值,但是千萬不要和 undefined 搞混,在下列場景中應當使用 null

    • 用來初始化一個變量,這個變量可能賦值為一個對象。
      var person = null;

    • 用來和一個已經初始化的變量比較,這個變量可以是也可以不是一個對象。
      var person = getPerson();

        if (person !== null) {  
            doSomething();
        }
      
    • 當函數的參數期望是對象時,用作參數傳入。
      function printPerson(person) {
      if (person !== null) {

                // print person
            }
        }
      
        printPerson(null);
      
    • 當函數的返回值期望是對象時,用作返回值傳出。
      function getPerson() {
      if (condition) {
      return new Person("Hwaphon");
      } else {
      return null;
      }
      }

  3. 我們通常將 undefinednull 搞混, 那是因為 undefined == null 的結果是 true, 然而這二者的用途卻各有不同。那些沒有被初始化的變量都有一個初始值,即 defined, 表示這個變量等待被賦值。有一點值得注意的是,用 typeof 去檢測變量,如果這個變量聲明了沒有初始化會返回 undefined, 二如果這個變量根本就沒聲明也會返回 undefined
    var person;

         console.log(typeof person); // undefined
         console.log(typeof animal); // undefined 
    
  4. JavaScrtipt 支持兩種不同類型的注釋,單行注釋和多行注釋。關于單行注釋,有三種使用方式。

    • 獨占一行的注釋,用來解釋下一行代碼。這行注釋之前總是有一個空行,且縮進層級和下一行代碼保持一致。
      if (condition) {

           // This is a single line comment
           doSomething();
       }
      
    • 在代碼行的尾部進行注釋。 代碼結束到注釋之間至少有一個縮進。注釋(包括之前的代碼部分)不應該超過但行的最大字符數( 80 ) 限制,如果超過了,就將這條注釋放置于當前代碼行的上方。
      if (condition) {
      doSomething(); // This is a single line comment
      }

    • 被注釋掉的是一大段代碼。
      // if (condition) {
      // doSomething();
      // }

關于多行注釋,,是通過 /* */ 來實現的,不過最好還是使用下面這樣的風格實現多行注釋。
/*
* First line
* Second line
* Third line
*/
至于什么時候使用注釋,有一條指導原則,當代碼不夠清晰時添加注釋,而當代碼很明了時不應當添加注釋。在以下情況會最好添加注釋。

  • 難于理解的代碼
  • 可能被誤認為錯誤的代碼
  • 瀏覽器特性 hack
  1. 使用 if 或者 for 語句時,不論塊語句包含多行代碼還是單行代碼,都應當使用花括號。

  2. switch 語句中, 盡量不要使用 case 語句的連續執行,如果非要使用的話,最好添加注釋。至于 default, 即使其什么都不做,最好也不腰省略,比如下面這樣。
    switch(condition) {
    case "first":
    break;

            case "second":
                break;
    
            default:
                // no logic here
        }
    
  3. 盡量不要使用 continue, 用 if 語句替代 continue 的功能。

  4. for-in 循環是用來遍歷對象屬性的,可是存在一個問題,它不僅遍歷對象的實例屬性,同樣還遍歷從原型繼承來的屬性。 所以最好使用 hasOwnProperty() 方法來為 for-in 循環過濾出實例屬性。

  5. 推薦在函數頂部使用單 var 語句聲明接下來可能會使用到的變量,而且沒有初始值的變量應該出現在 var 語句的尾部。

  6. 推薦先聲明函數再使用函數。

  7. 不推薦使用全局的嚴格模式,推薦使用局部的嚴格模式。

  8. CSSJavaScript 中分離,當需要通過 JavaScript 來修改元素樣式的時候,最佳的方法是操作 CSSclassName
    // original style
    element.className += " className";

        // HTML5 style
        element.classList.add("className");
    
  9. JavaScriptHTML 中抽離。可以自己創造一個 addListener() 函數添加行為,而不是在 HTML 結構中使用 onclick 之類的內嵌 JavaScript 代碼。
    function addListener(target, type, handler) {
    if (target.addEventListener) {
    target.addEventListener(type, handler, false);
    } else if(target.attachEvent) {
    target.attachEvent("on" + type, handler);
    } else {
    target["on" + type] = handler;
    }
    }

  10. typeof 檢測原始值, 用 instanceof 檢測引用值。 在使用這兩個運算符的時候不要加括號,那樣會讓它們看起來像函數。檢測函數最好使用 typeof,下面是檢測數組的一種方法。
    function isArray(value) {
    if (typeof Array.isArray === "function") {
    return Array.isArray(value);
    } else {
    return Object.prototype.toString.call(value) === "[object Array]";
    }
    }

  11. 對于一個對象,如果你想檢測某個屬性是否存在,有以下兩種方式。
    var person = {
    name: "hwaphon",
    age: 21
    };

        // Example one
        if ("name" in person) {
            console.log("Exsits");
        }
    
        // Example two
        if (person.hasOwnProperty("name")) {
            console.log("Exsits");
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容