日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

良好的JavaScript编码风格(语法规则)

發布時間:2024/4/15 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 良好的JavaScript编码风格(语法规则) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編碼風格

1.概述

“編程風格”(programming style)指的是編寫代碼的樣式規則。不同的程序員,往往有不同的編程風格。

有人說,編譯器的規范叫做“語法規則”(grammar),這是程序員必須遵守的;而編譯器忽略的部分,就叫“編程風格”(programming style),這是程序員可以自由選擇的。這種說法不完全正確,程序員固然可以自由選擇編程風格,但是好的編程風格有助于寫出質量更高、錯誤更少、更易于維護的程序。

所以,編程風格的選擇不應該基于個人愛好、熟悉程度、打字量等因素,而要考慮如何盡量使代碼清晰易讀、減少出錯。你選擇的,不是你喜歡的風格,而是一種能夠清晰表達你的意圖的風格。這一點,對于 JavaScript 這種語法自由度很高的語言尤其重要。

必須牢記的一點是,如果你選定了一種“編程風格”,就應該堅持遵守,切忌多種風格混用。如果你加入他人的項目,就應該遵守現有的風格。

2.縮進

行首的空格和 Tab 鍵,都可以產生代碼縮進效果(indent)。

Tab 鍵可以節省擊鍵次數,但不同的文本編輯器對 Tab 的顯示不盡相同,有的顯示四個空格,有的顯示兩個空格,所以有人覺得,空格鍵可以使得顯示效果更統一。

無論你選擇哪一種方法,都是可以接受的,要做的就是始終堅持這一種選擇。不要一會使用 Tab 鍵,一會使用空格鍵。

3.區塊

如果循環和判斷的代碼體只有一行,JavaScript 允許該區塊(block)省略大括號。

if (a) b(); c();

上面代碼的原意可能是下面這樣。

if (a) {b();c(); }

但是,實際效果卻是下面這樣。

if (a) {b(); }c();

因此,建議總是使用大括號表示區塊。

另外,區塊起首的大括號的位置,有許多不同的寫法。最流行的有兩種,一種是起首的大括號另起一行。

block {// ... }

另一種是起首的大括號跟在關鍵字的后面。

block {// ... }

一般來說,這兩種寫法都可以接受。但是,JavaScript 要使用后一種,因為 JavaScript 會自動添加句末的分號,導致一些難以察覺的錯誤。

return {key: value };// 相當于 return; {key: value };

上面的代碼的原意,是要返回一個對象,但實際上返回的是undefined,因為 JavaScript 自動在return語句后面添加了分號。為了避免這一類錯誤,需要寫成下面這樣。

return {key : value };

因此,表示區塊起首的大括號,不要另起一行。

4.圓括號

圓括號(parentheses)在 JavaScript 中有兩種作用,一種表示函數的調用,另一種表示表達式的組合(grouping)。

// 圓括號表示函數的調用 console.log('abc');// 圓括號表示表達式的組合 (1 + 2) * 3

建議可以用空格,區分這兩種不同的括號。

  • 表示函數調用時,函數名與左括號之間沒有空格。
  • 表示函數定義時,函數名與左括號之間沒有空格。
  • 其他情況時,前面位置的語法元素與左括號之間,都有一個空格。
  • 按照上面的規則,下面的寫法都是不規范的。

    foo (bar) return(a+b); if(a === 0) {...} function foo (b) {...} function(x) {...}

    上面代碼的最后一行是一個匿名函數,function是語法關鍵字,不是函數名,所以與左括號之間應該要有一個空格。

    5.行尾的分號

    5.1不使用分號的情況

    首先,以下三種情況,語法規定本來就不需要在結尾添加分號。

    (1)for 和 while 循環

    for ( ; ; ) { } // 沒有分號while (true) { } // 沒有分號

    注意,do...while循環是有分號的。

    do {a--; } while(a > 0); // 分號不能省略

    (2)分支語句:if,switch,try

    if (true) { } // 沒有分號switch () { } // 沒有分號try { } catch { } // 沒有分號

    (3)函數的聲明語句

    function f() { } // 沒有分號

    注意,函數表達式仍然要使用分號。

    var f = function f() { };j

    以上三種情況,如果使用了分號,并不會出錯。因為,解釋引擎會把這個分號解釋為空語句。

    5.2分號的自動添加

    除了上一節的三種情況,所有語句都應該使用分號。但是,如果沒有使用分號,大多數情況下,JavaScript 會自動添加。

    var a = 1 // 等同于 var a = 1;

    這種語法特性被稱為“分號的自動添加”(Automatic Semicolon Insertion,簡稱 ASI)。

    因此,有人提倡省略句尾的分號。麻煩的是,如果下一行的開始可以與本行的結尾連在一起解釋,JavaScript 就不會自動添加分號。

    // 等同于 var a = 3 var a = 3// 等同于 'abc'.length 'abc' .length// 等同于 return a + b; return a + b;// 等同于 obj.foo(arg1, arg2); obj.foo(arg1, arg2);// 等同于 3 * 2 + 10 * (27 / 6) 3 * 2 + 10 * (27 / 6)

    上面代碼都會多行放在一起解釋,不會每一行自動添加分號。這些例子還是比較容易看出來的,但是下面這個例子就不那么容易看出來了。

    x = y (function () {// ... })();// 等同于 x = y(function () {...})();

    下面是更多不會自動添加分號的例子。

    // 引擎解釋為 c(d+e) var a = b + c (d+e).toString();// 引擎解釋為 a = b/hi/g.exec(c).map(d) // 正則表達式的斜杠,會當作除法運算符 a = b /hi/g.exec(c).map(d);// 解釋為'b'['red', 'green'], // 即把字符串當作一個數組,按索引取值 var a = 'b' ['red', 'green'].forEach(function (c) {console.log(c); })// 解釋為 function (x) { return x }(a++) // 即調用匿名函數,結果f等于0 var a = 0; var f = function (x) { return x } (a++)

    只有下一行的開始與本行的結尾,無法放在一起解釋,JavaScript 引擎才會自動添加分號。

    if (a < 0) a = 0 console.log(a)// 等同于下面的代碼, // 因為 0console 沒有意義 if (a < 0) a = 0; console.log(a)

    另外,如果一行的起首是“自增”(++)或“自減”(--)運算符,則它們的前面會自動添加分號。

    a = b = c = 1a ++ b -- cconsole.log(a, b, c) // 1 2 0

    上面代碼之所以會得到1 2 0的結果,原因是自增和自減運算符前,自動加上了分號。上面的代碼實際上等同于下面的形式。

    a = b = c = 1; a; ++b; --c;

    如果continue、break、return和throw這四個語句后面,直接跟換行符,則會自動添加分號。這意味著,如果return語句返回的是一個對象的字面量,起首的大括號一定要寫在同一行,否則得不到預期結果。

    return { first: 'Jane' };// 解釋成 return; { first: 'Jane' };

    由于解釋引擎自動添加分號的行為難以預測,因此編寫代碼的時候不應該省略行尾的分號。

    不應該省略結尾的分號,還有一個原因。有些 JavaScript 代碼壓縮器(uglifier)不會自動添加分號,因此遇到沒有分號的結尾,就會讓代碼保持原狀,而不是壓縮成一行,使得壓縮無法得到最優的結果。

    另外,不寫結尾的分號,可能會導致腳本合并出錯。所以,有的代碼庫在第一行語句開始前,會加上一個分號。

    ;var a = 1; // ...

    上面這種寫法就可以避免與其他腳本合并時,排在前面的腳本最后一行語句沒有分號,導致運行出錯的問題。

    6.全局變量

    JavaScript 最大的語法缺點,可能就是全局變量對于任何一個代碼塊,都是可讀可寫。這對代碼的模塊化和重復使用,非常不利。

    因此,建議避免使用全局變量。如果不得不使用,可以考慮用大寫字母表示變量名,這樣更容易看出這是全局變量,比如UPPER_CASE。

    7.變量聲明

    JavaScript 會自動將變量聲明“提升”(hoist)到代碼塊(block)的頭部。

    if (!x) {var x = {}; }// 等同于 var x; if (!x) {x = {}; }

    這意味著,變量x是if代碼塊之前就存在了。為了避免可能出現的問題,最好把變量聲明都放在代碼塊的頭部。

    for (var i = 0; i < 10; i++) {// ... }// 寫成 var i; for (i = 0; i < 10; i++) {// ... }

    上面這樣的寫法,就容易看出存在一個全局的循環變量i。

    另外,所有函數都應該在使用之前定義。函數內部的變量聲明,都應該放在函數的頭部。

    8.with語句

    with可以減少代碼的書寫,但是會造成混淆。

    with (o) {foo = bar; }

    上面的代碼,可以有四種運行結果:

    o.foo = bar; o.foo = o.bar; foo = bar; foo = o.bar;

    這四種結果都可能發生,取決于不同的變量是否有定義。因此,不要使用with語句。

    9.相等和嚴格相等

    JavaScript 有兩個表示相等的運算符:“相等”(==)和“嚴格相等”(===)。

    相等運算符會自動轉換變量類型,造成很多意想不到的情況。

    0 == ''// true 1 == true // true 2 == true // false 0 == '0' // true false == 'false' // false false == '0' // true ' \t\r\n ' == 0 // true

    因此,建議不要使用相等運算符(==),只使用嚴格相等運算符(===)。

    10.語句的合并

    有些程序員追求簡潔,喜歡合并不同目的的語句。比如,原來的語句是

    a = b; if (a) {// ... }

    他喜歡寫成下面這樣。

    if (a = b) {// ... }

    雖然語句少了一行,但是可讀性大打折扣,而且會造成誤讀,讓別人誤解這行代碼的意思是下面這樣。

    if (a === b){// ... }

    建議不要將不同目的的語句,合并成一行。

    11.自增和自減

    自增(++)和自減(--)運算符,放在變量的前面或后面,返回的值不一樣,很容易發生錯誤。事實上,所有的++運算符都可以用+= 1代替。

    ++x // 等同于 x += 1;

    改用+= 1,代碼變得更清晰了。

    建議自增(++)和自減(--)運算符盡量使用+=和-=代替。

    12.switch...case 結構

    switch...case結構要求,在每一個case的最后一行必須是break語句,否則會接著運行下一個case。這樣不僅容易忘記,還會造成代碼的冗長。

    而且,switch...case不使用大括號,不利于代碼形式的統一。此外,這種結構類似于goto語句,容易造成程序流程的混亂,使得代碼結構混亂不堪,不符合面向對象編程的原則。

    function doAction(action) {switch (action) {case 'hack':return 'hack';case 'slash':return 'slash';case 'run':return 'run';default:throw new Error('Invalid action.');} }

    上面的代碼建議改寫成對象結構。

    function doAction(action) {var actions = {'hack': function () {return 'hack';},'slash': function () {return 'slash';},'run': function () {return 'run';}};if (typeof actions[action] !== 'function') {throw new Error('Invalid action.');}return actions[action](); }

    因此,建議switch...case結構可以用對象結構代替。

    13.參考鏈接

    • 阮一峰,JavaScript教程
    • Eric Elliott, Programming JavaScript Applications, Chapter 2. JavaScript Style Guide, O'Reilly, 2013
    • Axel Rauschmayer, A meta style guide for JavaScript
    • Axel Rauschmayer, Automatic semicolon insertion in JavaScript
    • Rod Vagg, JavaScript and Semicolons

    本文章采用知識共享 署名-相同方式共享 3.0協議

    轉載于:https://www.cnblogs.com/axinmir/p/10599721.html

    總結

    以上是生活随笔為你收集整理的良好的JavaScript编码风格(语法规则)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。