您好,登錄后才能下訂單哦!
Douglas Crockford是Javascript權(quán)威,Json格式就是他的發(fā)明。
去年11月他有一個(gè)演講,談到了好的Javascript編程風(fēng)格是什么。
我非常推薦這個(gè)演講,它不僅有助于學(xué)習(xí)Javascript,而且能讓你心情舒暢,因?yàn)镃rockford講得很幽默,時(shí)不時(shí)讓聽眾會(huì)心一笑。
下面,我根據(jù)這個(gè)演講和Crockford編寫的代碼規(guī)范,總結(jié)一下"Javascript編程風(fēng)格"。
所謂"編程風(fēng)格"(programming style),指的是編寫代碼的樣式規(guī)則。不同的程序員,往往有不同的編程風(fēng)格。
有人說,編譯器的規(guī)范叫做"語法規(guī)則"(grammar),這是程序員必須遵守的;而編譯器忽略的部分,就叫"編程風(fēng)格"(programming style),這是程序員可以自由選擇的。這種說法不完全正確,程序員固然可以自由選擇編程風(fēng)格,但是好的編程風(fēng)格有助于寫出質(zhì)量更高、錯(cuò)誤更少、更易于維護(hù)的程序。
所以,有一點(diǎn)應(yīng)該明確,"編程風(fēng)格"的選擇不應(yīng)該基于個(gè)人愛好、熟悉程度、打字工作量等因素,而要考慮如何盡量使代碼清晰易讀、減少出錯(cuò)。你選擇的,不是你喜歡的風(fēng)格,而是一種能夠清晰表達(dá)你的意圖的風(fēng)格。這一點(diǎn),對(duì)于Javascript這種語法自由度很高、設(shè)計(jì)不完全成熟的語言尤其重要。
一、大括號(hào)的位置
絕大多數(shù)的編程語言,都用大括號(hào)({})表示區(qū)塊(block)。起首的大括號(hào)的位置,有許多不同的寫法。
最流行的有兩種。一種是起首的大括號(hào)另起一行:
block { ... }
另一種是起首的大括號(hào)跟在關(guān)鍵字的后面:
block { ... }
一般來說,這兩種寫法都可以接受。但是,Javascript要使用后一種,因?yàn)镴avascript會(huì)自動(dòng)添加句末的分號(hào),導(dǎo)致一些難以察覺的錯(cuò)誤。
return { key:value; };
上面的代碼的原意,是要返回一個(gè)對(duì)象,但實(shí)際上返回的是undefined,因?yàn)镴avascript自動(dòng)在return語句后面添加了分號(hào)。為了避免這一類錯(cuò)誤,需要寫成下面這樣:
return { key : value; };
因此,
規(guī)則1:表示區(qū)塊起首的大括號(hào),不要另起一行。
二、 圓括號(hào)
圓括號(hào)(parentheses)在Javascript中有兩種作用,一種表示調(diào)用函數(shù),另一種表示不同的值的組合(grouping)。我們可以用空格,區(qū)分這兩種不同的括號(hào)。
規(guī)則2:調(diào)用函數(shù)的時(shí)候,函數(shù)名與左括號(hào)之間沒有空格。
規(guī)則3:函數(shù)名與參數(shù)序列之間,沒有空格。
規(guī)則4:所有其他語法元素與左括號(hào)之間,都有一個(gè)空格。
按照上面的規(guī)則,下面的寫法都是不規(guī)范的:
foo (bar) return(a+b); if(a === 0) {...} function foo (b) {...} function(x) {...}
三、分號(hào)
分號(hào)表示語句的結(jié)束。大多數(shù)情況下,如果你省略了句尾的分號(hào),Javascript會(huì)自動(dòng)添加。
var a = 1
等同于
var a = 1;
因此,有人提倡省略句尾的分號(hào)。但麻煩的是,如果下一行的第一個(gè)字元(token)是下面這五個(gè)字符之一,Javascript將不對(duì)上一行句尾添加分號(hào):"("、"["、"/"、"+"和"-"。
x = y (function (){ ... })();
上面的代碼等同于
x = y(function (){...})();
因此,
規(guī)則5:不要省略句末的分號(hào)。
四、with語句
with可以減少代碼的書寫,但是會(huì)造成混淆。
with (o) { foo = bar; }
上面的代碼,可以有四種運(yùn)行結(jié)果:
o.foo = bar; o.foo = o.bar; foo = bar; foo = o.bar;
這四種結(jié)果都可能發(fā)生,取決于不同的變量是否有定義。因此,
規(guī)則6:不要使用with語句。
五、相等和嚴(yán)格相等
Javascript有兩個(gè)表示"相等"的運(yùn)算符:"相等"(==)和"嚴(yán)格相等"(===)。
因?yàn)?相等"運(yùn)算符會(huì)自動(dòng)轉(zhuǎn)換變量類型,造成很多意想不到的情況:
0 == ''// true 1 == true // true 2 == true // false 0 == '0' // true false == 'false' // false false == '0' // true " \t\r\n " == 0 // true
因此,
規(guī)則7:不要使用"相等"(==)運(yùn)算符,只使用"嚴(yán)格相等"(===)運(yùn)算符。
六、語句的合并
有些程序員追求簡潔,喜歡合并不同目的的語句。比如,原來的語句是
a = b; if (a) {...}
他喜歡寫成下面這樣:
if (a = b) {...}
雖然語句少了一行,但是可讀性大打折扣,而且會(huì)造成誤讀,讓別人誤以為這行代碼的意思是:
if (a === b){...}
另外一種情況是,有些程序員喜歡在同一行中賦值多個(gè)變量:
var a = b = 0;
他以為,這行代碼等同于
var a = 0, b = 0;
實(shí)際上不是,它的真正效果是下面這樣:
b = 0; var a = b;
因此,
規(guī)則8:不要將不同目的的語句,合并成一行。
七、變量聲明
Javascript會(huì)自動(dòng)將變量聲明"提升"(hoist)到代碼塊(block)的頭部。
if (!o) { var o = {}; }
等同于
var o; if (!o) { o = {}; }
為了避免可能出現(xiàn)的問題,不如把變量聲明都放在代碼塊的頭部。
for (var i ...) {...}
最好寫成:
var i; for (i ...) {...,}
因此,
規(guī)則9:所有變量聲明都放在函數(shù)的頭部。
規(guī)則10:所有函數(shù)都在使用之前定義。
八、全局變量
Javascript最大的語法缺點(diǎn),可能就是全局變量對(duì)于任何一個(gè)代碼塊,都是可讀可寫。這對(duì)代碼的模塊化和重復(fù)使用,非常不利。
規(guī)則11:避免使用全局變量;如果不得不使用,用大寫字母表示變量名,比如UPPER_CASE。
九、new命令
Javascript使用new命令,從建構(gòu)函數(shù)生成一個(gè)新對(duì)象。
var o = new myObject();
這種做法的問題是,一旦你忘了加上new,myObject()內(nèi)部的this關(guān)鍵字就會(huì)指向全局對(duì)象,導(dǎo)致所有綁定在this上面的變量,都變成全部變量。
規(guī)則12:不要使用new命令,改用Object.create()命令。
如果不得不使用new,為了防止出錯(cuò),最好在視覺上把建構(gòu)函數(shù)與其他函數(shù)區(qū)分開來。
規(guī)則13:建構(gòu)函數(shù)的函數(shù)名,采用首字母大寫(InitialCap);其他函數(shù)名,一律首字母小寫。
十、自增和自減運(yùn)算符
自增(++)和自減(--)運(yùn)算符,放在變量的前面或后面,返回的值不一樣,很容易發(fā)生錯(cuò)誤。
事實(shí)上,所有的++運(yùn)算符都可以用"+= 1"代替。
++x
等同于
x += 1;
代碼變得更清晰了。有一個(gè)很可笑的例子,某個(gè)Javascript函數(shù)庫的源代碼中出現(xiàn)了下面的片段:
++x; ++x;
這個(gè)程序員忘了,還有更簡單、更合理的寫法:
x += 2;
因此,
規(guī)則14:不要使用自增(++)和自減(--)運(yùn)算符,用+=和-=代替。
十一、區(qū)塊
如果循環(huán)和判斷的代碼體只有一行,Javascript允許該區(qū)塊(block)省略大括號(hào)。
下面的代碼
if (a) b(); c();
原意可能是
if (a) { b(); c();}
但是,實(shí)際效果是
if (a) { b();} c();
因此,
規(guī)則15:總是使用大括號(hào)表示區(qū)塊。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。