javascript
JavaScript2谁刚开始学习应该知道4最佳实践文章(翻译)
原版的:24 JavaScript Best Practices for Beginners
(注:閱讀原文的時候沒有注意公布日期,覺得不錯就翻譯了,翻譯到JSON.parse那一節覺得有點不正確路才發現是2009年公布的文章,只是還是不錯的啦。
另外,文章雖說24條最佳實踐。其實僅僅有23條,不知道原作者怎么漏了一條。
)
1.優先使用===,而不是==
JavaScript使用兩種相等性操作符:===|!==和==|!=。通常覺得做比較的最佳實踐是使用前一組操作符。
“若兩個操作數的類型和值同樣,那么===比較的結果為真,!==比較的結果為假?!?— JavaScript語言精粹(JavaScript: The Good Parts)
然而。假設使用==和!=,當比較不同類型的操作數時,你就會碰到問題啦。在這樣的情況下,這組操作符會嘗試對操作數的值做沒用的強制轉換。
2.Eval就是糟糕的代名詞
對于那些不熟悉JavaScript的人來說,函數”evel”讓我們可以訪問JavaScript編譯器。我們可以通過給”eval”傳遞一個字符串參數來得到該字符串運行的結果。
這不僅會極大地降低你的腳本的性能。也會造成一個巨大的安全隱患,由于這賦予傳遞進來的純文本太多的能力。要盡可能地避免eval函數的使用。
3.不要懶手
技術上來說,你確實可能僥幸地省略多數花括號和分號。
大多數瀏覽器都可以正確地解釋例如以下代碼片段:
if(someVariableExists)x = false然而,再考慮一下這段代碼:
if(someVariableExists)x = falseanotherFunctionCall();可能會有人覺得上一段代碼等價于:
if(someVariableExists) {x = false;anotherFunctionCall(); }非常不幸,他錯了。其實。它的本意是:
if(someVariableExists)x = false; anotherFunctionCall();你應該也注意到了。代碼中縮進模仿了花括號的功能。毋庸置疑,這是非常恐怖的做法,不管怎樣都應該避免。唯一可以省略花括號的時候是在一行式的語句中。但即使這樣的情況,也是非常有爭議的。
if(2 + 2 === 4) return 'nicely done';始終要想著以后
假設以后的某個時候,你須要在這樣的if語句中添加很多其它的命令,那該怎么辦呢?沒法子。你就僅僅能重寫這塊代碼了。處理這個問題的底線是對于省略寫法保持慎重。
4.使用JS Lint
JSLint是Douglas Crockford編寫的一個調試器。
簡單地將你的腳本拷貝進去,它就會高速地掃描你的代碼中不論什么明顯的問題和錯誤。
“JSLint獲取一份JavaScript源代碼,然后掃描代碼。假設發現問題,就會返回一條信息描寫敘述這個問題以及這個問題在源代碼中的大致位置。
問題盡管常常是語法錯誤,卻不一定是。JSLint也會查看一些風格習慣以及結構問題。它并不證明你的代碼是否正確,僅僅是提供另外的一雙眼睛來幫助發現問題。”—JSLint文檔
在結束腳本代碼的編寫之前。對其運行一次JSLint。可以保證你不會犯一些愚蠢的錯誤。
5.將腳本置于頁面的底部
這條技巧在本系列前面的文章中也推薦過。由于它在此處也非常合適(As it’s highly appropriate though),所有我將那段信息直接粘貼在這里。
記住—這條最佳實踐的主要目標是盡可能高速地為用戶載入頁面。當載入一個腳本時。瀏覽器直到整個腳本文件所有載入完畢才干繼續。因此,用戶必須等上更長的時間才干注意到不論什么的進度。
假設JS文件的目的僅僅是添加功能—比如,在點擊某個button后—那么就將那些文件放在底部,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.降低全局變量
“通過將全局的東西封裝進單個命名空間??梢源蟠蠼档团c其它應用、部件、代碼庫交互混亂的概率?!薄?Douglas Crockford
var name = 'jeffrey'; var lastname = 'Way';function doSomething() {...}console.log(name); // Jeffrey -- or window.name更好的做法
var DudeNameSpace = {name: 'Jeffrey',lastname: 'Way',doSometing: function() {...} } console.log(DudeNameSpace.name); // Jeffrey注意我們是怎樣將全局性的“足跡”降低為一個命名可笑的”DudeNameSpace”對象的。
9.凝視你的代碼
一開始看起來似乎沒有必要。但請相信我。你將會想盡可能好地凝視你的代碼。當你幾個月后再次回到項目。會發生什么呢?發現你根本沒法輕松地記起當初對每一行代碼的想法?;蛘?。假設你的某個同事須要改動你的代碼。那又會怎么樣呢?始終,一直記著凝視你代碼的重要部分吧。
// Cycle through array and echo out each name for(var i = 0, len = array.length; i < len; i++) {console.log(array[i]); }10.擁抱漸進增強
始終考慮到怎樣處理JavaScript禁用的情況。或許你會想“大多數我網頁的閱讀器都是啟用JavaScript的,因此我不操心這個問題。”然而。這會是一個巨大的錯誤。
你曾花時間去看過關閉JavaScript后你的美麗的滑動條是什么樣么?(下載Web開發人員工具欄以方便干這事。)或許它會全然破壞你的網站。依照以往經驗,設計你的網站時應假設將會禁用JavaScript。
那么,一旦你這樣做了,那么開始漸進地增強你的網頁布局吧!
11.不要傳遞字符串給”SetInterval”或”SetTimeOut”
考慮一下例如以下代碼:
setInterval( "document.getElementById('container').innerHTML += 'my new number: ' + i", 3000 );這段代碼不僅低效,并且其行為與”eval”函數同樣。永遠不要傳給字符串給SetInterval和SetTimeOut。相反,應傳遞一個函數名。
setInterval(someFunction, 3000);12.不要使用”With”語句
乍一看?!盬ith”語句似乎是個聰明的想法。基本概念是它們可以為訪問深度嵌套對象提供一種簡寫方式。比如…
with (being.person.man.bodyparts) {arms = true;legs = true; }代替例如以下寫法
being.person.man.bodyparts.arms = true; being.person.man.bodyparts.legs = true;非常不幸,經過一些測試,會發現這樣的簡寫在設置新成員時表現非常糟糕。作為替代,你應該使用var。
var o = being.person.man.bodyparts; o.arms = true; o.legs = true;13.使用{}而不是New Object()
JavaScript中有多種創建對象的方式?;蛟S更傳統的方式是使用”new”構造器,像這樣:
var o = new Object(); o.name = 'Jeffrey'; o.lastname = 'Way'; o.someFuncion = 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中一個常見的錯誤是須要數組時使用對象或須要對象時使用數組。規則非常easy:當屬性名是小的連續整數時,你應該使用數組。否則,使用對象”—Douglas Crockford
15.一長串變量?省略”var”keyword,使用逗號替代
var someItem = 'some string'; var anotherItem = 'another string'; var oneMoreItem = 'one more string';更好的寫法
var someItem = 'some string',anotherItem = 'another string',oneMoreItem = 'one more string';相當的不言自明。
我不知道這里是否有不論什么真正的速度提升,可是它使你的代碼更加簡潔了。
16.始終,始終使用分號
技術上來說,大多數瀏覽器都同意你的省略一些分號。
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開發博客的超級粉絲(比方這個博客!
)。但吃午餐或者睡前,博客確實不是書籍的替代品。始終在你的床前桌上放一本wen開發書籍吧。
例如以下是一些我最喜歡的JavaScript書籍。
- 面向對象的JavaScript
- JavaScript:語言精粹
- 學習jQuery 1.3
- 學習JavaScript
多閱讀幾遍。我仍舊在讀。
21.自運行函數(Self-Executing Functions)
相比調用函數。當頁面載入或調用父函數時,讓函數自己主動運行會簡單些。簡單地將你的函數包裝在圓括號內,并加入額外的一對圓括號。其本質上就調用了這個函數。
(function doSomething() {return {name: 'jeff',lastName: 'way'};})();22.原始(raw)JavaScript代碼的運行速度始終快于使用代碼庫
JavaScript代碼庫,如jQuery和Mootools,可以為你節省大量的編碼時間—特別是使用AJAX操作。話雖如此。始終謹記代碼庫的運行速度始終是比不上原始JavaScript代碼的(假設了代碼的正確性)。
jQuery的”each”方法用來做遍歷非常贊,但使用原生”for”語句始終會快一些。
23.Crockford的JSON.Parse
盡管JavaScript 2應該有一個內置的JSON解析器,但寫本文之時,我們仍舊須要自己實現。
Douglas Crockford。JSON的創造者,已經實現了一個解析器供你使用??梢詮倪@里下載。
簡單地導入該腳本。你就能獲得一個新的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”
幾年前,在script標簽內常見有”language”屬性。
<script type="text/javascript" language="javascript"> ... </script>然而,這個屬性非常早就被棄用了,所以就不要再使用了。
就這些了。同志們
如今你知道這JavaScript剛開始學習的人應該知道的24條基本技巧。
有機會,讓我知道你現在的提示。感謝您的閱讀。
轉載于:https://www.cnblogs.com/lcchuguo/p/4615333.html
總結
以上是生活随笔為你收集整理的JavaScript2谁刚开始学习应该知道4最佳实践文章(翻译)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ip查看日志
- 下一篇: 一篇关于校园的爱情故事:伤感