本文總結了20則JavaScript的最佳實踐,但願對各位爪哇國編劇有用。(順帶推銷下CoffeeScript)javascript
。html
===
JavaScript有兩種等值運算符,分別是===
和==
,以及!==
和!=
。比較兩個值的時候,請使用前者,避免JavaScript討厭的強制類型轉換帶來預料以外的結果。java
CoffeeScript下只提供無強制類型轉換的==
(別名is
)和!=
(別名isnt
),不用頭疼選哪一種。jquery
eval
讓咱們將字符串做爲參數執行,這是很是強大的特性。然而,eval
會大幅下降腳本的性能,也會引發安全問題。除非你打算用JavaScript寫一個編譯器,仍是對eval
敬而遠之的好。web
省掉一些花括號,大多數瀏覽器仍然能理解,例如:ajax
if(someVariableExists) x = false
然而,複雜一點的代碼就可能帶來問題:segmentfault
if(someVariableExists) x = false anotherFunctionCall();
你想表達的也許是:數組
if(someVariableExists) { x = false; anotherFunctionCall(); }
然而實際上等價於:瀏覽器
if(someVariableExists) { x = false; } anotherFunctionCall();
因此,仍是乖乖地寫花括號吧,這能爲你省去無數麻煩。安全
若是你真那麼討厭花括號,仍是投入CoffeeScript的懷抱吧:
if someVariable? x = false if someVariable? x = false anotherFunctionCall()
同理,大多數瀏覽器容許你省略分號:
var someItem = 'some string' function doSomething() { return 'something' }
這和省略花括號同樣糟糕,仍是老實一點好:
var someItem = 'some string'; function doSomething() { return 'something'; }
或者,投奔CoffeeScript吧,不用分號了:
someItem = 'some string' doSomething = -> 'something'
函數的寫法是否是也很帥?直接定義一個匿名函數,而後把它賦給一個變量便可。
JSLint是一款很是棒的調試器,它會迅速找出代碼中的問題,包括語法錯誤、編碼風格和程序結構問題。
腳本加載是阻塞的,腳本加載並執行完以後,瀏覽器不能繼續渲染下面的內容。所以,用戶被迫等待更長時間。若是你的JavaScript腳本只是用來加強效果,那麼請將它放在頁面的最後:
<p>And now you know my favorite kinds of corn. </p> <script type="text/javascript" src="path/to/file.js"></script> <script type="text/javascript" src="path/to/anotherFile.js"></script> </body> </html>
糟糕的例子:
for(var i = 0; i < someArray.length; i++) { var container = document.getElementById('container'); container.innerHtml += 'my number: ' + i; console.log(i); }
每次循環都要計算數組的長度,每次都要遍歷DOM查詢「container」元素,效率低下!
改爲這樣就好一些:
var container = document.getElementById('container'); for(var i = 0, len = someArray.length; i < len; i++) { container.innerHtml += 'my number: ' + i; console.log(i); }
遍歷數組或對象的時候不必定要用for
,使用原生函數每每是更好的選擇:
var arr = ['item 1', 'item 2', 'item 3', ...]; var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
避免模塊和類庫互相干擾。
var name = 'Jeffrey'; var lastName = 'Way'; function doSomething() {...} console.log(name);
更好:
var DudeNameSpace = { name : 'Jeffrey', lastName : 'Way', doSomething : function() {...} } console.log(DudeNameSpace.name)
CoffeeScipt下變量默認非全局,不須要加var
,並且編譯的時候,整個.coffee
文件處於一個函數之中,也就是說,一個獨立的命名空間。使用CoffeeScript,不用再操心全局變量問題。
良好的註釋,幫助別人或者幾個月以後的你理解你的代碼。
「大多數訪問者啓用了JavaScript,沒必要擔憂」這是很大的誤區。
花費一點時間查看下你漂亮的頁面在javascript被關閉時是什麼樣的吧。設計網站時,首先假定 JavaScript 是被禁用的,在此基礎上,漸進加強網站。
setInterval
或setTimeout
傳遞字符串參數setInterval( "document.getElementById('container').innerHTML += 'My new number: ' + i", 3000 );
上面的代碼和eval
一模一樣,效率低下。咱們應該傳遞函數:
setInterval(someFunction, 3000);
with
看起來,使用with
語句的代碼很清晰,例如:
with (being.person.man.bodyparts) { arms = true; legs = true; }
這比下面的要清爽得多:
being.person.man.bodyparts.arms = true; being.person.man.bodyparts.legs= true;
很不幸,使用with
語句致使添加新成員時性能低下,咱們仍是用變量吧:
var o = being.person.man.bodyparts; o.arms = true; o.legs = true;
{}
代替new Object()
new
加構造函數能夠建立對象:
var o = new Object(); o.name = 'Jeffrey'; o.lastName = 'Way'; o.someFunction = function() { console.log(this.name); }
這種方法多受詬病,更好的作法是:
var o = { name: 'Jeffrey', lastName = 'Way', someFunction : function() { console.log(this.name); } };
這樣咱們就不須要直接調用構造函數,也不須要爲傳遞給函數的參數的正確順序而提心吊膽。
[]
代替new Array()
建立數組也是同樣的道理。
var a = new Array(); a[0] = "Joe"; a[1] = 'Plumber';
不如
var a = ['Joe','Plumber'];
var someItem = 'some string'; var anotherItem = 'another string'; var oneMoreItem = 'one more string';
不如這樣:
var someItem = 'some string', anotherItem = 'another string', oneMoreItem = 'one more string';
這樣代碼更清晰。
CoffeeScript?正如咱們前面提到的,變量默認非全局,因此咱們根本不須要var
。
for in
遍歷對象的屬性的時候,還會遍歷方法函數,真浪費。加上一個if
語句過濾下:
for(key in object) { if(object.hasOwnProperty(key) { ...then do something... } }
Firebug timer 能夠簡單地肯定操做消耗的時間:
function TimeTracker(){ console.time("MyTimer"); for(x=5000; x > 0; x--){} console.timeEnd("MyTimer"); }
午飯之餘或上牀睡覺以前,讀點書吧。牀頭常發一本web開發方面的書。我喜歡讀的一些書包括:
讀下吧。多讀幾遍。我常讀。
用括號包裹函數定義,而後應用函數:
(function doSomething() { return { name: 'jeff', lastName: 'way' }; })();
CoffeeScript版本更簡潔:
(-> { name: 'jeff', lastName: 'way' })()
用do
的話更清楚:
do -> { name: 'jeff', lastName: 'way' }
jQuery和Mootools能夠節約你大量的開發時間——特別是處理AJAX。可是別忘了,使用庫永遠不會比原生代碼快(假定你編碼正確)。
本文爲24 JavaScript Best Practices for Beginners的衍生做品,在其基礎上進行了歸併調整,並加入了 CoffeeScript 的內容。