給JavaScript初學者的24條最佳實踐
作為”30 HTML和CSS最佳實踐”的後續,本週,我們將回顧JavaScript的知識 !如果你看完了下面的內容,請務必讓我們知道你掌握的小技巧!
1.使用 === 代替 ==
JavaScript 使用2種不同的等值運算子:===|!== 和 ==|!=,在比較操作中使用前者是最佳實踐。
“如果兩邊的運算元具有相同的型別和值,===返回true,!==返回false。”——JavaScript:語言精粹
然而,當使用==和!=時,你可能會遇到型別不同的情況,這種情況下,運算元的型別會被強制轉換成一樣的再做比較,這可能不是你想要的結果。
2.Eval=邪惡
起初不太熟悉時,“eval”讓我們能夠訪問JavaScript的編譯器(譯註:這看起來很強大)。從本質上講,我們可以將字串傳遞給eval作為引數,而執行它。
這不僅大幅降低指令碼的效能(譯註:JIT編譯器無法預知字串內容,而無法預編譯和優化),而且這也會帶來巨大的安全風險,因為這樣付給要執行的文字太高的許可權,避而遠之。
3.省略未必省事
從技術上講,你可以省略大多數花括號和分號。大多數瀏覽器都能正確理解下面的程式碼:
if(someVariableExists)
x = false
然後,如果像下面這樣:
if(someVariableExists)
x = false
anotherFunctionCall();
有人可能會認為上面的程式碼等價於下面這樣:
if(someVariableExists) {
x = false;
anotherFunctionCall();
}
不幸的是,這種理解是錯誤的。實際上的意思如下:
if(someVariableExists) {
x = false;
}
anotherFunctionCall();
你可能注意到了,上面的縮排容易給人花括號的假象。無可非議,這是一種可怕的實踐,應不惜一切代價避免。僅有一種情況下,即只有一行的時候,花括號是可以省略的,但這點是飽受爭議的。
if(2 + 2 === 4) return 'nicely done';
未雨綢繆
很可能,有一天你需要在if語句塊中新增更多的語句。這樣的話,你必須重寫這段程式碼。底線——省略是雷區。
4.使用JSLint
JSLint是由大名鼎鼎的道格拉斯(Douglas Crockford)編寫的偵錯程式。簡單的將你的程式碼貼上進JSLint中,它會迅速找出程式碼中明顯的問題和錯誤。
“JSLint掃面輸入的原始碼。如果發現一個問題,它返回一條描述問題和一個程式碼中的所在位置的訊息。問題並不一定是語法錯誤,儘管通常是這樣。JSLint還會檢視一些編碼風格和程式結構問題。這並不能保證你的程式是正確的。它只是提供了另一雙幫助發現問題的眼睛。”——JSLing 文件
部署指令碼之前,執行JSLint,只是為了確保你沒有做出任何愚蠢的錯誤。
5.將指令碼放在頁面的底部
在本系列前面的文章裡已經提到過這個技巧,我貼上資訊在這裡。
記住——首要目標是讓頁面儘可能快的呈獻給使用者,指令碼的夾在是阻塞的,指令碼載入並執行完之前,瀏覽器不能繼續渲染下面的內容。因此,使用者將被迫等待更長時間。
如果你的js只是用來增強效果——例如,按鈕的單擊事件——馬上將指令碼放在body結束之前。這絕對是最佳實踐。
建議
<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>
6.避免在For語句內宣告變數
當執行冗長的for語句時,要保持語句塊的儘量簡潔,例如:
糟糕
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);
}
感興趣可以思考如何繼續優化上面的程式碼,歡迎留下評論大家分享。
7.構建字串的最優方法
當你需要遍歷陣列或物件的時候,不要總想著“for”語句,要有創造性,總能找到更好的辦法,例如,像下面這樣。
var arr = ['item 1', 'item 2', 'item 3', ...];
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
我不是你心中神,但請你相信我(不信你自己測試)——這是迄今為止最快的方法!使用原生程式碼(如 join()),不管系統內部做了什麼,通常比非原生快很多。——James Padolsey, james.padolsey.com
8.減少全域性變數
只要把多個全域性變數都整理在一個名稱空間下,擬將顯著降低與其他應用程式、元件或類庫之間產生糟糕的相互影響的可能性。——Douglas Crockford
var name = 'Jeffrey';
var lastName = 'Way';
function doSomething() {...}
console.log(name); // Jeffrey -- 或 window.name
更好的做法
var DudeNameSpace = {
name : 'Jeffrey',
lastName : 'Way',
doSomething : function() {...}
}
console.log(DudeNameSpace.name); // Jeffrey
注:這裡只是簡單命名為 "DudeNameSpace",實際當中要取更合理的名字。
9.給程式碼新增註釋
似乎沒有必要,當請相信我,儘量給你的程式碼新增更合理的註釋。當幾個月後,重看你的專案,你可能記不清當初你的思路。或者,假如你的一位同事需要修改你的程式碼呢?總而言之,給程式碼新增註釋是重要的部分。
// 迴圈陣列,輸出每項名字(譯者注:這樣的註釋似乎有點多餘吧).
for(var i = 0, len = array.length; i < len; i++) {
console.log(array[i]);
}
10.擁抱漸進增強
確保javascript被禁用的情況下能平穩退化。我們總是被這樣的想法吸引,“大多數我的訪客已經啟用JavaScript,所以我不必擔心。”然而,這是個很大的誤區。
你可曾花費片刻檢視下你漂亮的頁面在javascript被關閉時是什麼樣的嗎?(下載 Web Developer 工具就能很容易做到(譯者注:chrome使用者在應用商店裡自行下載,ie使用者在Internet選項中設定)),這有可能讓你的網站支離破碎。作為一個經驗法則,設計你的網站時假設JavaScript是被禁用的,然後,在此基礎上,逐步增強你的網站。
11.不要給"setInterval"或"setTimeout"傳遞字串引數
考慮下面的程式碼:
setInterval(
"document.getElementById('container').innerHTML += 'My new number: ' + i", 3000
);
不僅效率低下,而且這種做法和"eval"如出一轍。從不給setInterval和setTimeout傳遞字串作為引數,而是像下面這樣傳遞函式名。
setInterval(someFunction, 3000);
12.不要使用"with"語句
乍一看,"with"語句看起來像一個聰明的主意。基本理念是,它可以為訪問深度巢狀物件提供縮寫,例如……
with (being.person.man.bodyparts) {
arms = true;
legs = true;
}
而不是像下面這樣:
being.person.man.bodyparts.arms = true;
being.person.man.bodyparts.legs= true;
不幸的是,經過測試後,發現這時“設定新成員時表現得非常糟糕。作為代替,您應該使用變數,像下面這樣。
var o = being.person.man.bodyparts;
o.arms = true;
o.legs = true;
13.使用{}代替 new Ojbect()
在JavaScript中建立物件的方法有多種。可能是傳統的方法是使用"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);
}
};
注意,如果你只是想建立一個空物件,{}更好。
var o = {};
“物件字面量使我們能夠編寫更具特色的程式碼,而且相對簡單的多。不需要直接呼叫建構函式或維持傳遞給函式的引數的正確順序,等”——dyn-web.com
14.使用[]代替 new Array()
這同樣適用於建立一個新的陣列。
例如:
var a = new Array();
a[0] = "Joe";
a[1] = 'Plumber';
更好的做法:
var a = ['Joe','Plumber'];
“javascript程式中常見的錯誤是在需要物件的時候使用陣列,而需要陣列的時候卻使用物件。規則很簡單:當屬性名是連續的整數時,你應該使用陣列。否則,請使用物件”——Douglas Crockford
15.定義多個變數時,省略var關鍵字,用逗號代替
var someItem = 'some string';
var anotherItem = 'another string';
var oneMoreItem = 'one more string';
更好的做法
var someItem = 'some string',
anotherItem = 'another string',
oneMoreItem = 'one more string';
…應而不言自明。我懷疑這裡真的有所提速,但它能是你的程式碼更清晰。
17.謹記,不要省略分號
從技術上講,大多數瀏覽器允許你省略分號。
var someItem = 'some string'
function doSomething() {
return 'something'
}
已經說過,這是一個非常糟糕的做法可能會導致更大的,難以發現的問題。
更好的做法
var someItem = 'some string';
function doSomething() {
return 'something';
}
18."For in"語句
當遍歷物件的屬性時,你可能會發現還會檢索方法函式。為了解決這個問題,總在你的程式碼裡包裹在一個if語句來過濾資訊。
for(key in object) {
if(object.hasOwnProperty(key) {
...then do something...
}
}
參考 JavaScript:語言精粹,道格拉斯(Douglas Crockford)。
19.使用Firebug的"timer"功能優化你的程式碼
在尋找一個快速、簡單的方法來確定操作需要多長時間嗎?使用Firebug的“timer”功能來記錄結果。
function TimeTracker(){
console.time("MyTimer");
for(x=5000; x > 0; x--){}
console.timeEnd("MyTimer");
}
20.閱讀,閱讀,反覆閱讀
雖然我是一個巨大的web開發部落格的粉絲(像這樣!),午餐之餘或上床睡覺之前,實在沒有什麼比一本書更合適了,堅持放一本web開發方面書在你的床頭櫃。下面是一些我最喜愛的JavaScript書籍。
- Object-Oriented JavaScript(JavaScript物件導向程式設計指南 pdf)
- JavaScript:The Good Parts(JavaScript語言精粹 修訂版 pdf)
- Learning jQuery 1.3(jQuery基礎教程 第4版 pdf)
- Learning JavaScript(JavaScript學習指南 pdf)
讀了他們……多次。我仍將繼續!
21.自執行函式
和呼叫一個函式類似,它很簡單的使一個函式在頁面載入或父函式被呼叫時自動執行。簡單的將你的函式用圓括號包裹起來,然後新增一個額外的設定,這本質上就是呼叫函式。
(function doSomething() {
return {
name: 'jeff',
lastName: 'way'
};
})();
22.原生程式碼永遠比庫快
JavaScript庫,例如jQuery和Mootools等可以節省大量的編碼時間,特別是AJAX操作。已經說過,總是記住,庫永遠不可能比原生JavaScript程式碼更快(假設你的程式碼正確)。
jQuery的“each”方法是偉大的迴圈,但使用原生"for"語句總是更快。
23.道格拉斯的 JSON.Parse
儘管JavaScript 2(ES5)已經內建了JSON 解析器。但在撰寫本文時,我們仍然需要自己實現(相容性)。道格拉斯(Douglas Crockford),JSON之父,已經建立了一個你可以直接使用的解析器。這裡可以下載(連結已壞,可以在這裡檢視相關資訊http://www.json.org/)。
只需簡單匯入指令碼,您將獲得一個新的全域性JSON物件,然後可以用來解析您的json檔案。
var response = JSON.parse(xhr.responseText);
var container = document.getElementById('container');
for(var i = 0, len = response.length; i < len; i++) {
container.innerHTML += '<li>' + response[i].name + ' : ' + response[i].email + '</li>';
}
24.移除"language"屬性
曾經指令碼標籤中的“language”屬性非常常見。
<script type="text/javascript" language="javascript">
...
</script>
然而,這個屬性早已被棄用,所以請移除(譯者注:html5 中已廢棄,但如果你喜歡,你仍然可以新增)。
就這樣吧,夥計
現在你已經學到了,24條JavaScript初學者的必備技巧。讓我知道你高效技巧吧!感謝你的閱讀。本系列的第三部分主題會是什麼呢(思索中)?
譯者補充
第三部分在這裡:高效jQuery的奧祕
本文為翻譯文章,原文為“24 JavaScript Best Practices for Beginners”
關於#20 的補充,下面是譯者認為的一些好書,有興趣的讀者可以留言討論
- javascript模式(和上面JavaScript物件導向程式設計指南同一作者,這本書更好)
- javascript設計模式
- 編寫可維護的javascript(尼古拉斯新書)
- 高效能javascript(尼古拉斯 已絕版)
- javascript語言精髓與程式設計實踐
- javascript高階程式設計(尼古拉斯)
我的部落格 更多內容請點選這裡。
相關文章
- ChatGPT初學者最佳實踐ChatGPT
- 24個javascript最佳實踐JavaScript
- 給初學者:攻擊是有條件的(轉)
- 給初學者:JavaScript 中陣列操作注意點JavaScript陣列
- 獻給UNIX的初學者
- 給Java初學者的十條小建議,快來收藏吧!Java
- 國外PHP大師給初學者的8條建議PHP
- JavaScript初學者必看“this”JavaScript
- RAC 和 Oracle Clusterware 最佳實踐和初學者指南 (AIX)1526555.1OracleAI
- JavaScript 最佳實踐JavaScript
- 給初學者的Web安全指南Web
- 給初學者的 type 命令教程
- 給初學者的 fc 示例教程
- 給初學者的20個CSS實用建議CSS
- RAC 和 Oracle Clusterware 最佳實踐和初學者指南(平臺無關部分)Oracle
- 給初學者看的 shuf 命令教程
- 給初學者的 Android 加密工具Android加密
- 給安卓初學者的12篇教程安卓
- JavaScript最佳實踐:效能JavaScript
- 給初學者,因為我就是個初學者(3) (569字)
- RAC 和 Oracle Clusterware 最佳實踐和初學者指南 (AIX) (文件 ID 1526555.1)OracleAI
- 軟體開發實踐的24條軍規
- Google:12 條 Golang 最佳實踐Golang
- Apache Airflow十條最佳實踐ApacheAI
- 給初學者的RxJava2.0教程(三)RxJava
- 給初學者的RxJava2.0教程(七)RxJava
- 給初學者的 RxJava2.0 教程 (四)RxJava
- 給 DevOps 初學者的入門指南dev
- 給初學者的RxJava2.0教程(一)RxJava
- 給初學者的RxJava2.0教程(二)RxJava
- 給初學者的RxJava2.0教程(五)RxJava
- 給初學者的 RxJava2.0 教程 (八)RxJava
- 給初學者的RxJava2.0教程(四)RxJava
- 給初學者的RxJava2.0教程(八)RxJava
- 給初學者的RxJava2.0教程(九)RxJava
- 給初學者的 RxJava2.0 教程 (九)RxJava
- 給C++初學者的50個忠告C++
- JavaScript 模組(1):初學者指南JavaScript