JavaScript編程風格 (copy)

來源:互聯網
上載者:User

  今天複習了一下javascript方面的一點知識。從文檔中發現了這樣一篇文章,也不記得當時是從哪下載的了。拿來與大家分享一下,首先向原作者致敬!

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

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

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

一、大括弧的位置

絕大多數的程式設計語言,都用大括弧({})表示區塊(block)。起首的大括弧的位置,有許多不同的寫法。

最流行的有兩種。一種是起首的大括弧另起一行:

block  

{  

...  

另一種是起首的大括弧跟在關鍵字的後面:

block {  

...  

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

return  

{  

key:value;  

}; 

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

return {  

key : value;  

}; 

因此,

規則1:表示區塊起首的大括弧,不要另起一行。

二、圓括弧

圓括弧(parentheses)在JavaScript中有兩種作用,一種表示調用函數,另一種表示不同的值的組合(grouping)。我們可以用空格,區分這兩種不同的括弧。

規則2:調用函數的時候,函數名與左括弧之間沒有空格。

規則3:函數名與參數序列之間,沒有空格。

規則4:所有其他文法元素與左括弧之間,都有一個空格。

按照上面的規則,下面的寫法都是不規範的:

foo (bar)  

return (a+b);  

if (a === 0) {...}  

function foo (b) {...}  

function (x) {...} 

 

三、分號

分號表示語句的結束。大多數情況下,如果你省略了句尾的分號,JavaScript會自動添加。

var a = 1

等同於

var a = 1;

因此,有人提倡省略句尾的分號。但麻煩的是,如果下一行的第一個字元(token)是下面這五個字元之一,JavaScript將不對上一行句尾添加分號:"("、"["、"/"、"+"和"-"。

x = y 

(function (){  

...  

})(); 

上面的代碼等同於

x = y (function (){...})();

因此,

規則5:不要省略句末的分號。

四、with語句

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

with (o) {  

foo = bar;  

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

o.foo = bar;  

oo.foo = o.bar;  

foo = bar;  

foo = o.bar; 

這四種結果都可能發生,取決於不同的變數是否有定義。因此,

規則6:不要使用with語句。

 

五、相等和嚴格相等

JavaScript有兩個表示"相等"的運算子:"相等"(==)和"嚴格相等"(===)。

因為"相等"運算子會自動轉換變數類型,造成很多意想不到的情況:

0 == ''// true  

1 == true // true  

2 == true // false  

0 == '0' // true  

false == 'false' // false  

false == '0' // true  

" \t\r\n " == 0 // true 

因此,

規則7:不要使用"相等"(==)運算子,只使用"嚴格相等"(===)運算子。

六、語句的合并

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

a = b;

if (a) {...}

他喜歡寫成下面這樣:

if (a = b) {...}

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

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

另外一種情況是,有些程式員喜歡在同一行中賦值多個變數:

var a = b = 0;

他以為,這行代碼等同於

var a = 0, b = 0;

實際上不是,它的真正效果是下面這樣:

b = 0;

var a = b;

因此,

規則8:不要將不同目的的語句,合并成一行。

 

七、變數聲明

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

if (!o) {  

var o = {};  

等同於

var o;  

if (!o) {  

o = {};  

為了避免可能出現的問題,不如把變數聲明都放在代碼塊的頭部。

for (var i ...) {...}

最好寫成:

var i;

for (i ...) {...,}

因此,

規則9:所有變數聲明都放在函數的頭部。

規則10:所有函數都在使用之前定義。

八、全域變數

JavaScript最大的文法缺點,可能就是全域變數對於任何一個代碼塊,都是可讀可寫。這對代碼的模組化和重複使用,非常不利。

規則11:避免使用全域變數;如果不得不使用,用大寫字母表示變數名,比如UPPER_CASE。

 

九、new命令

JavaScript使用new命令,從建構函數產生一個新對象。

var o = new myObject ();

這種做法的問題是,一旦你忘了加上 new,myObject ()內部的this關鍵字就會指向全域對象,導致所有綁定在this上面的變數,都變成全部變數。

規則12:不要使用new命令,改用Object.create()命令。

如果不得不使用new,為了防止出錯,最好在視覺上把建構函數與其他函數區分開來。

規則13:建構函數的函數名,採用首字母大寫(InitialCap);其他函數名,一律首字母小寫。

十、自增和自減運算子

自增(++)和自減(--)運算子,放在變數的前面或後面,返回的值不一樣,很容易發生錯誤。

事實上,所有的++運算子都可以用"+= 1"代替。

++x

等同於

x += 1;

代碼變得更清晰了。有一個很可笑的例子,某個JavaScript函數庫的原始碼中出現了下面的片段:

++x;

++x;

這個程式員忘了,還有更簡單、更合理的寫法:

x += 2;

因此,

規則14:不要使用自增(++)和自減(--)運算子,用+=和-=代替。

十一、區塊

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

下面的代碼

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

原意可能是

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

但是,實際效果是

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

因此,

規則15:總是使用大括弧表示區塊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.