av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

給JavaScript初學(xué)者的23條最佳實(shí)踐

瀏覽:3日期:2023-11-24 08:36:36
1.使用 === 代替 ==

JavaScript 使用2種不同的等值運(yùn)算符:===|!== 和 ==|!=,在比較操作中使用前者是最佳實(shí)踐。

“如果兩邊的操作數(shù)具有相同的類型和值,===返回true,!==返回false。”——《JavaScript:語(yǔ)言精粹》

然而,當(dāng)使用==和!=時(shí),你可能會(huì)遇到類型不同的情況,這種情況下,操作數(shù)的類型會(huì)被強(qiáng)制轉(zhuǎn)換成一樣的再做比較,這可能不是你想要的結(jié)果。

2.Eval=邪惡

起初不太熟悉時(shí),“eval”讓我們能夠訪問JavaScript的編譯器(譯注:這看起來很強(qiáng)大)。從本質(zhì)上講,我們可以將字符串傳遞給eval作為參數(shù),而執(zhí)行它。

這不僅大幅降低腳本的性能(譯注:JIT編譯器無法預(yù)知字符串內(nèi)容,而無法預(yù)編譯和優(yōu)化),而且這也會(huì)帶來巨大的安全風(fēng)險(xiǎn),因?yàn)檫@樣付給要執(zhí)行的文本太高的權(quán)限,避而遠(yuǎn)之。

3.省略未必省事

從技術(shù)上講,你可以省略大多數(shù)花括號(hào)和分號(hào)。大多數(shù)瀏覽器都能正確理解下面的代碼:

if(someVariableExists) x = false

然后,如果像下面這樣:

if(someVariableExists) x = false anotherFunctionCall();

有人可能會(huì)認(rèn)為上面的代碼等價(jià)于下面這樣:

if(someVariableExists) { x = false; anotherFunctionCall(); }

不幸的是,這種理解是錯(cuò)誤的。實(shí)際上的意思如下:

if(someVariableExists) { x = false; } anotherFunctionCall();

你可能注意到了,上面的縮進(jìn)容易給人花括號(hào)的假象。無可非議,這是一種可怕的實(shí)踐,應(yīng)不惜一切代價(jià)避免。僅有一種情況下,即只有一行的時(shí)候,花括號(hào)是可以省略的,但這點(diǎn)是飽受爭(zhēng)議的。

if(2 + 2 === 4) return ’nicely done’;

未雨綢繆

很可能,有一天你需要在if語(yǔ)句塊中添加更多的語(yǔ)句。這樣的話,你必須重寫這段代碼。底線——省略是雷區(qū)。

4.使用JSLint

JSLint是由大名鼎鼎的道格拉斯(Douglas Crockford)編寫的調(diào)試器。簡(jiǎn)單的將你的代碼粘貼進(jìn)JSLint中,它會(huì)迅速找出代碼中明顯的問題和錯(cuò)誤。

“JSLint掃面輸入的源代碼。如果發(fā)現(xiàn)一個(gè)問題,它返回一條描述問題和一個(gè)代碼中的所在位置的消息。問題并不一定是語(yǔ)法錯(cuò)誤,盡管通常是這樣。JSLint還會(huì)查看一些編碼風(fēng)格和程序結(jié)構(gòu)問題。這并不能保證你的程序是正確的。它只是提供了另一雙幫助發(fā)現(xiàn)問題的眼睛。”——JSLing 文檔

部署腳本之前,運(yùn)行JSLint,只是為了確保你沒有做出任何愚蠢的錯(cuò)誤。

5.將腳本放在頁(yè)面的底部

在本系列前面的文章里已經(jīng)提到過這個(gè)技巧,我粘貼信息在這里。

給JavaScript初學(xué)者的23條最佳實(shí)踐

記住——首要目標(biāo)是讓頁(yè)面盡可能快的呈獻(xiàn)給用戶,腳本的加載是阻塞的,腳本加載并執(zhí)行完之前,瀏覽器不能繼續(xù)渲染下面的內(nèi)容。因此,用戶將被迫等待更長(zhǎng)時(shí)間。

如果你的js只是用來增強(qiáng)效果——例如,按鈕的單擊事件——馬上將腳本放在body結(jié)束之前。這絕對(duì)是最佳實(shí)踐。

建議

<p>And now you know my favorite kinds of corn. </p> <script type='text/javascript' src='http://www.4tl426be.cn/bcjs/path/to/file.js'></script> <script type='text/javascript' src='http://www.4tl426be.cn/bcjs/path/to/anotherFile.js'></script> </body> </html>6.避免在For語(yǔ)句內(nèi)聲明變量

當(dāng)執(zhí)行冗長(zhǎng)的for語(yǔ)句時(shí),要保持語(yǔ)句塊的盡量簡(jiǎn)潔,例如:

糟糕

for(var i = 0; i < someArray.length; i++) { var container = document.getElementById(’container’); container.innerHtml += ’my number: ’ + i; console.log(i); }

注意每次循環(huán)都要計(jì)算數(shù)組的長(zhǎng)度,并且每次都要遍歷dom查詢“container”元素——效率嚴(yán)重地下!

建議

var container = document.getElementById(’container’); for(var i = 0, len = someArray.length; i < len; i++) { container.innerHtml += ’my number: ’ + i; console.log(i); }

感興趣可以思考如何繼續(xù)優(yōu)化上面的代碼,歡迎留下評(píng)論大家分享。

7.構(gòu)建字符串的最優(yōu)方法

當(dāng)你需要遍歷數(shù)組或?qū)ο蟮臅r(shí)候,不要總想著“for”語(yǔ)句,要有創(chuàng)造性,總能找到更好的辦法,例如,像下面這樣。

var arr = [’item 1’, ’item 2’, ’item 3’, ...]; var list = ’<ul><li>’ + arr.join(’</li><li>’) + ’</li></ul>’;

我不是你心中的神,但請(qǐng)你相信我(不信你自己測(cè)試)——這是迄今為止最快的方法!使用原生代碼(如 join()),不管系統(tǒng)內(nèi)部做了什么,通常比非原生快很多。——James Padolsey, james.padolsey.com

8.減少全局變量

只要把多個(gè)全局變量都整理在一個(gè)名稱空間下,擬將顯著降低與其他應(yīng)用程序、組件或類庫(kù)之間產(chǎn)生糟糕的相互影響的可能性。——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

注:這里只是簡(jiǎn)單命名為 “DudeNameSpace”,實(shí)際當(dāng)中要取更合理的名字。

9.給代碼添加注釋

似乎沒有必要,當(dāng)請(qǐng)相信我,盡量給你的代碼添加更合理的注釋。當(dāng)幾個(gè)月后,重看你的項(xiàng)目,你可能記不清當(dāng)初你的思路。或者,假如你的一位同事需要修改你的代碼呢?總而言之,給代碼添加注釋是重要的部分。

// 循環(huán)數(shù)組,輸出每項(xiàng)名字(譯者注:這樣的注釋似乎有點(diǎn)多余吧). for(var i = 0, len = array.length; i < len; i++) { console.log(array[i]); }10.擁抱漸進(jìn)增強(qiáng)

確保javascript被禁用的情況下能平穩(wěn)退化。我們總是被這樣的想法吸引,“大多數(shù)我的訪客已經(jīng)啟用JavaScript,所以我不必?fù)?dān)心。”然而,這是個(gè)很大的誤區(qū)。

你可曾花費(fèi)片刻查看下你漂亮的頁(yè)面在javascript被關(guān)閉時(shí)是什么樣的嗎?(下載Web Developer工具就能很容易做到(譯者注:chrome用戶在應(yīng)用商店里自行下載,ie用戶在Internet選項(xiàng)中設(shè)置)),這有可能讓你的網(wǎng)站支離破碎。作為一個(gè)經(jīng)驗(yàn)法則,設(shè)計(jì)你的網(wǎng)站時(shí)假設(shè)JavaScript是被禁用的,然后,在此基礎(chǔ)上,逐步增強(qiáng)你的網(wǎng)站。

11.不要給”setInterval”或”setTimeout”傳遞字符串參數(shù)

考慮下面的代碼:

setInterval( 'document.getElementById(’container’).innerHTML += ’My new number: ’ + i', 3000 );

不僅效率低下,而且這種做法和”eval”如出一轍。從不給setInterval和setTimeout傳遞字符串作為參數(shù),而是像下面這樣傳遞函數(shù)名。

setInterval(someFunction, 3000);12.不要使用”with”語(yǔ)句

乍一看,”with”語(yǔ)句看起來像一個(gè)聰明的主意。基本理念是,它可以為訪問深度嵌套對(duì)象提供縮寫,例如……

with (being.person.man.bodyparts) { arms = true; legs = true; }

而不是像下面這樣:

being.person.man.bodyparts.arms = true; being.person.man.bodyparts.legs= true;

不幸的是,經(jīng)過測(cè)試后,發(fā)現(xiàn)這時(shí)“設(shè)置新成員時(shí)表現(xiàn)得非常糟糕。作為代替,您應(yīng)該使用變量,像下面這樣。

var o = being.person.man.bodyparts; o.arms = true; o.legs = true;13.使用{}代替 new Ojbect()

在JavaScript中創(chuàng)建對(duì)象的方法有多種。可能是傳統(tǒng)的方法是使用”new”加構(gòu)造函數(shù),像下面這樣:

var o = new Object(); o.name = ’Jeffrey’; o.lastName = ’Way’; o.someFunction = function() { console.log(this.name); }

然而,這種方法的受到的詬病不及實(shí)際上多。作為代替,我建議你使用更健壯的對(duì)象字面量方法。

更好的做法

var o = { name: ’Jeffrey’, lastName = ’Way’, someFunction : function() { console.log(this.name); } };

注意,果你只是想創(chuàng)建一個(gè)空對(duì)象,{}更好。

var o = {};

“對(duì)象字面量使我們能夠編寫更具特色的代碼,而且相對(duì)簡(jiǎn)單的多。不需要直接調(diào)用構(gòu)造函數(shù)或維持傳遞給函數(shù)的參數(shù)的正確順序,等”——dyn-web.com

14.使用[]代替 new Array()

這同樣適用于創(chuàng)建一個(gè)新的數(shù)組。

例如:

var a = new Array(); a[0] = 'Joe'; a[1] = ’Plumber’;

更好的做法:

var a = [’Joe’,’Plumber’];

“javascript程序中常見的錯(cuò)誤是在需要對(duì)象的時(shí)候使用數(shù)組,而需要數(shù)組的時(shí)候卻使用對(duì)象。規(guī)則很簡(jiǎn)單:當(dāng)屬性名是連續(xù)的整數(shù)時(shí),你應(yīng)該使用數(shù)組。否則,請(qǐng)使用對(duì)象”——Douglas Crockford

15.定義多個(gè)變量時(shí),省略var關(guān)鍵字,用逗號(hào)代替

var someItem = ’some string’; var anotherItem = ’another string’; var oneMoreItem = ’one more string’;

更好的做法

var someItem = ’some string’, anotherItem = ’another string’, oneMoreItem = ’one more string’;

…應(yīng)而不言自明。我懷疑這里真的有所提速,但它能是你的代碼更清晰。

16.謹(jǐn)記,不要省略分號(hào)

從技術(shù)上講,大多數(shù)瀏覽器允許你省略分號(hào)。

var someItem = ’some string’ function doSomething() { return ’something’ }

已經(jīng)說過,這是一個(gè)非常糟糕的做法可能會(huì)導(dǎo)致更大的,難以發(fā)現(xiàn)的問題。

更好的做法

var someItem = ’some string’; function doSomething() { return ’something’; }17.”For in”語(yǔ)句

當(dāng)遍歷對(duì)象的屬性時(shí),你可能會(huì)發(fā)現(xiàn)還會(huì)檢索方法函數(shù)。為了解決這個(gè)問題,總在你的代碼里包裹在一個(gè)if語(yǔ)句來過濾信息。

for(key in object) { if(object.hasOwnProperty(key) { ...then do something... } }

參考 JavaScript:語(yǔ)言精粹,道格拉斯(Douglas Crockford)。

18.使用Firebug的”timer”功能優(yōu)化你的代碼

在尋找一個(gè)快速、簡(jiǎn)單的方法來確定操作需要多長(zhǎng)時(shí)間嗎?使用Firebug的“timer”功能來記錄結(jié)果。

function TimeTracker(){ console.time('MyTimer'); for(x=5000; x > 0; x--){} console.timeEnd('MyTimer'); }19.閱讀,閱讀,反復(fù)閱讀

雖然我是一個(gè)巨大的web開發(fā)博客的粉絲(像這樣!),午餐之余或上床睡覺之前,實(shí)在沒有什么比一本書更合適了,堅(jiān)持放一本web開發(fā)方面書在你的床頭柜。下面是一些我最喜愛的JavaScript書籍。

《Object-Oriented JavaScript| JavaScript面向?qū)ο缶幊讨改稀贰禞avaScript:The Good Parts|JavaScript語(yǔ)言精粹修訂版》《Learning jQuery 1.3|jQuery基礎(chǔ)教程 第4版》《Learning JavaScript|JavaScript學(xué)習(xí)指南》

讀了他們……多次。我仍將繼續(xù)!

20.自執(zhí)行函數(shù)

和調(diào)用一個(gè)函數(shù)類似,它很簡(jiǎn)單的使一個(gè)函數(shù)在頁(yè)面加載或父函數(shù)被調(diào)用時(shí)自動(dòng)運(yùn)行。簡(jiǎn)單的將你的函數(shù)用圓括號(hào)包裹起來,然后添加一個(gè)額外的設(shè)置,這本質(zhì)上就是調(diào)用函數(shù)。

(function doSomething() { return { name: ’jeff’, lastName: ’way’ }; })();21.原生代碼永遠(yuǎn)比庫(kù)快

JavaScript庫(kù),例如jQuery和Mootools等可以節(jié)省大量的編碼時(shí)間,特別是AJAX操作。已經(jīng)說過,總是記住,庫(kù)永遠(yuǎn)不可能比原生JavaScript代碼更快(假設(shè)你的代碼正確)。

jQuery的“each”方法是偉大的循環(huán),但使用原生”for”語(yǔ)句總是更快。

22.道格拉斯的 JSON.Parse

盡管JavaScript 2(ES5)已經(jīng)內(nèi)置了JSON 解析器。但在撰寫本文時(shí),我們?nèi)匀恍枰约簩?shí)現(xiàn)(兼容性)。道格拉斯(Douglas Crockford),JSON之父,已經(jīng)創(chuàng)建了一個(gè)你可以直接使用的解析器。這里可以下載(鏈接已壞,可以在這里查看相關(guān)信息http://www.json.org/)。

只需簡(jiǎn)單導(dǎo)入腳本,您將獲得一個(gè)新的全局JSON對(duì)象,然后可以用來解析您的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>’; }23.移除”language”屬性

曾經(jīng)腳本標(biāo)簽中的“l(fā)anguage”屬性非常常見。

<script type='text/javascript' language='javascript'> ... </script>

然而,這個(gè)屬性早已被棄用,所以請(qǐng)移除(譯者注:html5 中已廢棄,但如果你喜歡,你仍然可以添加)。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 谁有毛片网址 | 欧美日韩一区二区在线 | 日本综合久久 | 三级黄色片网站 | 在线日韩欧美 | 日本精品久久久 | 激情五月综合网 | 日皮视频在线观看 | 欧美日本精品 | 超碰人人网 | 午夜影院在线 | 国产又粗又黄又爽又硬的视频 | av手机天堂| 一级免费黄色片 | 日韩av不卡在线观看 | 亚洲精品91天天久久人人 | 国产精品久久久久久久免费看 | 欧美日韩综合 | 四级黄色片| av一区二区在线观看 | 黄色a一级片 | 涩涩999| 久久久网 | 久久精品一区二区国产 | 欧美一级片在线 | 久久网av | 永久黄网站色视频免费观看w | 在线免费观看黄色片 | 日本成人中文字幕 | 看逼网站 | 久久久精品影院 | 日韩精品在线一区 | 亚洲人高潮女人毛茸茸 | 日韩黄色影院 | 欧美日韩国产片 | 成人在线a| 香蕉视频国产 | 波多野吉衣一二三区乱码 | 99精品久久久久久中文字幕 | 欧美视频一二三区 | 国产黄a三级三级看三级 |