所謂“編程風(fēng)格”正勒,指的是編寫代碼的樣式規(guī)則。
程序員固然可以自由選擇編程風(fēng)格悼尾,但是好的編程風(fēng)格有助于寫出質(zhì)量更高柿扣、錯(cuò)誤更少疗韵、更易于維護(hù)的程序盐股。
所以,”編程風(fēng)格”的選擇不應(yīng)該基于個(gè)人愛好就谜、熟悉程度舷胜、打字量等因素娩践,而要考慮如何盡量使代碼清晰易讀、減少出錯(cuò)烹骨。你選擇的翻伺,不是你喜歡的風(fēng)格,而是一種能夠清晰表達(dá)你的意圖的風(fēng)格沮焕。這一點(diǎn)吨岭,對(duì)于JS這種語法自由度很高的語言尤其重要。
一峦树、縮進(jìn)
空格和Tab鍵辣辫,都可以產(chǎn)生縮進(jìn)效果(indent)旦事。
Tab鍵可以節(jié)省擊鍵次數(shù),但不同的文本編輯器對(duì)Tab的顯示不盡相同急灭,有的顯示四個(gè)空格姐浮,有的顯示兩個(gè)空格,所以有人覺得葬馋,空格鍵可以使得顯示效果更統(tǒng)一卖鲤。
無論你選擇哪一種方法,都是可以接受的畴嘶,要做的就是始終堅(jiān)持這一種選擇蛋逾。不要一會(huì)使用Tab鍵,一會(huì)使用空格鍵窗悯。
二区匣、區(qū)塊
如果循環(huán)和判斷的代碼體只有一行,JS允許該區(qū)塊省略大括號(hào)蟀瞧。
但是這樣容易造成錯(cuò)誤沉颂,建議總是使用大括號(hào)表示區(qū)塊。
表示區(qū)塊起首的大括號(hào)悦污,不要另起一行铸屉。因?yàn)镴S會(huì)自動(dòng)添加句末的分號(hào),導(dǎo)致一些難以察覺的錯(cuò)誤切端。
return
{
key: value
};
// 相當(dāng)于
return;
{
key: value
};
三彻坛、圓括號(hào)
圓括號(hào)在JS中有兩種作用,一種表示函數(shù)的調(diào)用踏枣,一種表示表達(dá)式的組合昌屉。
// 圓括號(hào)表示函數(shù)的調(diào)用
console.log('abc');
// 圓括號(hào)表示表達(dá)式的組合
(1 + 2) * 3
我們可以用空格,區(qū)分這兩種不同的括號(hào)茵瀑。
1间驮、表示函數(shù)調(diào)用時(shí),函數(shù)名名與左括號(hào)之間沒有空格马昨。
2竞帽、表示函數(shù)定義時(shí),函數(shù)名與左括號(hào)之間沒有空格鸿捧。
3屹篓、其他情況時(shí),前面位置的語法元素與左括號(hào)之間匙奴,都有一個(gè)空格堆巧。
四、行尾的分號(hào)
分號(hào)表示一條語句的結(jié)束。JS規(guī)定谍肤,行尾的分號(hào)可以省略啦租。事實(shí)上,確實(shí)有一些開發(fā)者行尾從來不寫分號(hào)荒揣。但是刷钢,強(qiáng)烈建議還是不要省略這個(gè)分號(hào)。
4.1乳附、不需要使用分號(hào)的情況
有一些語法結(jié)構(gòu)不需要在語句的結(jié)尾添加分號(hào),主要是以下三種情況伴澄。
(1)for和while循環(huán)
for ( ; ; ) {
} // 沒有分號(hào)
while (true) {
} // 沒有分號(hào)
需要注意的是do...while
循環(huán)是有分號(hào)的赋除。
do {
a--;
} while(a > 0); // 分號(hào)不能省略
(2)分支語句:if,switch非凌,try
if (true) {
} // 沒有分號(hào)
switch () {
} // 沒有分號(hào)
try {
} catch {
} // 沒有分號(hào)
(3)函數(shù)的聲明語句
function f() {
} // 沒有分號(hào)
但是函數(shù)表達(dá)式仍然要使用分號(hào)举农。
var f = function f() {};
以上三種情況,如果使用了分號(hào)敞嗡,并不會(huì)出錯(cuò)颁糟。因?yàn)椋忉屢鏁?huì)把這個(gè)分號(hào)解釋為空語句喉悴。
4.1棱貌、其它情況一律要寫上分號(hào),不要讓JS引擎去猜測(cè)
五箕肃、全局變量
JS最大的語法缺點(diǎn)婚脱,可能就是全局變量對(duì)于任何一個(gè)代碼塊,都是可讀可寫勺像。這對(duì)代碼的模塊化和重復(fù)使用障贸,非常不利。
因此吟宦,盡量避免使用全局變量篮洁。
六、變量聲明
JS會(huì)自動(dòng)將變量聲明”提升”到代碼塊的頭部殃姓。
為了避免可能出現(xiàn)的問題袁波,最好把變量聲明都放在代碼塊的頭部。
所有函數(shù)都應(yīng)該在使用之前定義辰狡,函數(shù)內(nèi)部的變量聲明锋叨,都應(yīng)該放在函數(shù)的頭部。
七宛篇、new命令
JS使用new
命令娃磺,從構(gòu)造函數(shù)生成一個(gè)新對(duì)象。
var o = new myObject();
上面這種做法的問題是叫倍,一旦你忘了加上new
偷卧,myObject()
內(nèi)部的this
關(guān)鍵字就會(huì)指向全局對(duì)象豺瘤,導(dǎo)致所有綁定在this
上面的變量,都變成全局變量听诸。
因此坐求,建議使用Object.create()
命令,替代new
命令晌梨。如果不得不使用new
桥嗤,為了防止出錯(cuò),最好在視覺上把構(gòu)造函數(shù)與其他函數(shù)區(qū)分開來仔蝌。比如泛领,構(gòu)造函數(shù)的函數(shù)名,采用首字母大寫敛惊,其他函數(shù)名一律首字母小寫渊鞋。
八、with語句
不要使用with
語句瞧挤。
九锡宋、相等和嚴(yán)格相等
JS中有兩個(gè)表示“相等”的運(yùn)算符:“相等”和“嚴(yán)格相等”。
因?yàn)椤跋嗟取边\(yùn)算符會(huì)自動(dòng)轉(zhuǎn)換變量類型特恬,造成很多意想不到的情況执俩。因此,不要使用“相等”(==
)運(yùn)算符癌刽,只使用“嚴(yán)格相等”(===
)運(yùn)算符奠滑。
十、語句的合并
有些程序員追求簡(jiǎn)潔妒穴,喜歡合并不同目的的語句宋税。比如,原來的語句是
a = b;
if (a) { // ...}
他喜歡寫成下面這樣讼油。
if (a = b) { // ...} //賦值永遠(yuǎn)都會(huì)成功
雖然語句少了一行杰赛,但是可讀性大打折扣,而且會(huì)造成誤讀矮台,讓別人誤解這行代碼的意思是下面這樣乏屯。
if (a === b){ // ...}
建議不要將不同目的的語句,合并成一行瘦赫。
十一辰晕、自增和自減運(yùn)算符
自增(++
)和自減(--
)運(yùn)算符,放在變量的前面或后面确虱,返回的值不一樣含友,很容易發(fā)生錯(cuò)誤。事實(shí)上,所有的++
運(yùn)算符都可以用+= 1
代替窘问。
十二辆童、switch...case結(jié)構(gòu)
switch...case
結(jié)構(gòu)要求,在每一個(gè)case
的最后一行必須是break
語句惠赫,否則會(huì)接著運(yùn)行下一個(gè)case
把鉴。這樣不僅容易忘記,還會(huì)造成代碼的冗長(zhǎng)儿咱。
而且庭砍,switch...case
不使用大括號(hào),不利于代碼形式的統(tǒng)一混埠。
建議避免使用switch...case
結(jié)構(gòu)逗威,用對(duì)象結(jié)構(gòu)代替。
(本系列完結(jié))