現(xiàn)在請你告訴我,你究竟為了我哪一點(diǎn)壞處而開始愛起我來呢? --- 威廉·莎士比亞
本附錄中,我們會(huì)展示JS一些有問題的特性,但我們很容易就能避免它們。通過這些簡單的做法,你就可以使JS成為一門更好的語言,也讓你自己成為一個(gè)更好的程序員。
1. ==
==、!= 和 ===、!==
2. with語句
with語句在JS中存在,本身就嚴(yán)重影響了JS處理器的速度,因?yàn)樗柚沽俗兞棵脑~法作用域綁定。它的本意是好的,但如果沒有它,JS語言會(huì)更好一點(diǎn)。
3. eval
eval 函數(shù)傳遞一個(gè)字符串給JS編譯器,并且執(zhí)行其結(jié)果。
使用eval
(1)形式的代碼會(huì)更加難以閱讀。這種形式將使得性能顯著降低,以為它須運(yùn)行編譯器,但也許只是為了執(zhí)行一個(gè)微不足道的賦值語句。
(2)eval函數(shù)還減弱了你的應(yīng)用的安全性,因?yàn)樗o被求值的文本授予了太多的權(quán)力。就像with語句執(zhí)行的方式一樣,它降低了語言的性能。
(3)eval還有個(gè)很大的問題,在eval中定義的變量,會(huì)被全局訪問到。會(huì)造成全局變量污染。
4. continue 語句
移除continue語句,性能改善。
5. switch 貫穿
千萬記住要使用break來中斷流程。
6. 缺少塊語句
比如:
if (ok)
t = true;
advance();
看起來,他想要這樣:
if (ok) {
t = true;
advance();
}
但實(shí)際上它本意是:
if (ok) {
t = true;
}
advance();
所以,要嚴(yán)格遵守規(guī)范,禁止省略代碼塊。
7. function 語句對比函數(shù)表達(dá)式
function 語句在解析時(shí)會(huì)發(fā)生被提升的情況。這意味著不管 function 被放置在哪里,它會(huì)被移動(dòng)到被定義時(shí)所在作用域頂層。
這放寬了函數(shù)必須先聲明后使用的要求,這樣會(huì)導(dǎo)致混亂。
在if 語句中使用function語句也是被禁止的。
理由如下:
我們先來看一段代碼:
console.log(typeof foo);
function foo(){ return 1; }
console.log(typeof foo);
上面這段代碼在各個(gè)瀏覽器中有一樣的結(jié)果:"function"、"function"。
這是沒有瀏覽器差異的行為,原因是函數(shù)聲明提升(Function Declaration Hoisting)
console.log(typeof foo);
if (true) {
function foo(){
return 1;
}
}
console.log(typeof foo);
上面這段代碼在Gecko引擎中打印"undefined"、"function";而在其他瀏覽器中則打印"function"、"function"。
原因在于Gecko加入了ECMAScript以外的一個(gè)feature:條件式函數(shù)聲明。
條件式函數(shù)聲明跟函數(shù)表達(dá)式的處理方式一樣。因此,條件式函數(shù)聲明喪失了函數(shù)聲明提升的特性。
基于以上原因,請不要在你的代碼里將函數(shù)聲明嵌套在條件語句內(nèi)。
8. 類型的包裝對象
不要使用new Boolean,new Number或new String。
也請避免使用 new Object 和 new Array,可使用{} 和 []來代替
9. new
打算與 new 結(jié)合使用的函數(shù)應(yīng)該命名為首字母大寫的形式,并且首字母大寫的形式應(yīng)該只用來命名那些構(gòu)造函數(shù)
一個(gè)更好的策略是根本不去使用 new 。
10. void
在JS中,void是一個(gè)運(yùn)算符,它接受一個(gè)運(yùn)算符并返回undefined。這沒什么用,而且會(huì)使人迷惑,應(yīng)該避免使用它。