JavaScript開發(fā)的40+個經典技巧

JavaScript開發(fā)的40+個經典技巧

JavaScript是一個絕冠全球的編程語言媚赖,可用于Web開發(fā)漏隐、移動應用開發(fā)(PhoneGap狈孔、Appcelerator)信认、服務器端開發(fā)(Node.js和Wakanda)等等。JavaScript還是很多新手踏入編程世界的第一個語言均抽。既可以用來顯示瀏覽器中的簡單提示框嫁赏,也可以通過nodebot或nodruino來控制機器人。能夠編寫結構清晰油挥、性能高效的JavaScript代碼的開發(fā)人員潦蝇,現(xiàn)如今已成了招聘市場最受追捧的人。

在這篇文章里喘漏,將和大家分享一些JavaScript的技巧护蝶、秘訣和最佳實踐华烟,除了少數(shù)幾個外翩迈,不管是瀏覽器的JavaScript引擎,還是服務器端JavaScript解釋器盔夜,均適用负饲。

本文中的示例代碼堤魁,通過了在GoogleChrome 30最新版(V83.20.17.15)上的測試。

1返十、首次為變量賦值時務必使用var關鍵字

變量沒有聲明而直接賦值得話妥泉,默認會作為一個新的全局變量,要盡量避免使用全局變量洞坑。

2盲链、使用===取代==

==和!=操作符會在需要的情況下自動轉換數(shù)據類型。但===和!==不會迟杂,它們會同時比較值和數(shù)據類型刽沾,這也使得它們要比==和!=快。

JavaScript開發(fā)的40+個經典技巧

3排拷、underfined侧漓、null、0监氢、false布蔗、NaN、空字符串的邏輯結果均為false

4浪腐、行尾使用分號

實踐中最好還是使用分號纵揍,忘了寫也沒事,大部分情況下JavaScript解釋器都會自動添加议街。對于為何要使用分號骡男,可參考文章JavaScript中關于分號的真相。

5傍睹、使用對象構造器

JavaScript開發(fā)的40+個經典技巧

6隔盛、小心使用typeof、instanceof和contructor

  • typeof:JavaScript一元操作符拾稳,用于以字符串的形式返回變量的原始類型吮炕,注意,typeofnull也會返回object访得,大多數(shù)的對象類型(數(shù)組Array龙亲、時間Date等)也會返回object
  • contructor:內部原型屬性,可以通過代碼重寫
  • instanceof:JavaScript操作符悍抑,會在原型鏈中的構造器中搜索鳄炉,找到則返回true,否則返回false
JavaScript開發(fā)的40+個經典技巧

7搜骡、使用自調用函數(shù)

函數(shù)在創(chuàng)建之后直接自動執(zhí)行拂盯,通常稱之為自調用匿名函數(shù)(Self-InvokedAnonymous Function)或直接調用函數(shù)表達式(ImmediatelyInvoked Function Expression )。格式如下:

JavaScript開發(fā)的40+個經典技巧

8记靡、從數(shù)組中隨機獲取成員

JavaScript開發(fā)的40+個經典技巧

9谈竿、獲取指定范圍內的隨機數(shù)

這個功能在生成測試用的假數(shù)據時特別有數(shù)团驱,比如介與指定范圍內的工資數(shù)。

JavaScript開發(fā)的40+個經典技巧

10空凸、生成從0到指定值的數(shù)字數(shù)組

JavaScript開發(fā)的40+個經典技巧

varnumbersArray =[],max =100;for(vari=1;numbersArray.push(i++)<max;); //numbers = [1,2,3 ... 100]

11嚎花、生成隨機的字母數(shù)字字符串

JavaScript開發(fā)的40+個經典技巧

12、打亂數(shù)字數(shù)組的順序

JavaScript開發(fā)的40+個經典技巧

這里使用了JavaScript內置的數(shù)組排序函數(shù)呀洲,更好的辦法是用專門的代碼來實現(xiàn)(如Fisher-Yates算法)紊选,可以參見StackOverFlow上的這個討論。

13道逗、字符串去空格

Java丛楚、C#和PHP等語言都實現(xiàn)了專門的字符串去空格函數(shù),但JavaScript中是沒有的憔辫,可以通過下面的代碼來為String對象函數(shù)一個trim函數(shù):

JavaScript開發(fā)的40+個經典技巧

新的JavaScript引擎已經有了trim()的原生實現(xiàn)趣些。

14、數(shù)組之間追加

JavaScript開發(fā)的40+個經典技巧

vararray1 =[12,"foo",{name"Joe"},-2458];vararray2 =["Doe",555,100];Array.prototype.push.apply(array1,array2);/*array1 值為 [12, "foo" , {name "Joe"} , -2458 , "Doe", 555 , 100] */

15贰您、對象轉換為數(shù)組

JavaScript開發(fā)的40+個經典技巧

16坏平、驗證是否是數(shù)字

JavaScript開發(fā)的40+個經典技巧

17、驗證是否是數(shù)組

JavaScript開發(fā)的40+個經典技巧

但如果toString()方法被重寫過得話锦亦,就行不通了舶替。也可以使用下面的方法:

JavaScript開發(fā)的40+個經典技巧

如果在瀏覽器中沒有使用frame,還可以用instanceof杠园,但如果上下文太復雜顾瞪,也有可能出錯。

JavaScript開發(fā)的40+個經典技巧

18抛蚁、獲取數(shù)組中的最大值和最小值

JavaScript開發(fā)的40+個經典技巧

19陈醒、清空數(shù)組

JavaScript開發(fā)的40+個經典技巧

20、不要直接從數(shù)組中delete或remove元素

如果對數(shù)組元素直接使用delete瞧甩,其實并沒有刪除钉跷,只是將元素置為了undefined。數(shù)組元素刪除應使用splice肚逸。

切忌:

JavaScript開發(fā)的40+個經典技巧

而應:

JavaScript開發(fā)的40+個經典技巧

刪除對象的屬性時可以使用delete爷辙。

21、使用length屬性截斷數(shù)組

前面的例子中用length屬性清空數(shù)組朦促,同樣還可用它來截斷數(shù)組:

JavaScript開發(fā)的40+個經典技巧

與此同時膝晾,如果把length屬性變大,數(shù)組的長度值變會增加务冕,會使用undefined來作為新的元素填充血当。length是一個可寫的屬性。

JavaScript開發(fā)的40+個經典技巧

22、在條件中使用邏輯與或

JavaScript開發(fā)的40+個經典技巧

邏輯或還可用來設置默認值歹颓,比如函數(shù)參數(shù)的默認值坯屿。

JavaScript開發(fā)的40+個經典技巧

23油湖、使得map()函數(shù)方法對數(shù)據循環(huán)

JavaScript開發(fā)的40+個經典技巧

24巍扛、留指定小數(shù)位數(shù)

JavaScript開發(fā)的40+個經典技巧

注意,toFixec()返回的是字符串乏德,不是數(shù)字撤奸。

25、浮點計算的問題

JavaScript開發(fā)的40+個經典技巧

為什么呢喊括?因為0.1+0.2等于0.30000000000000004胧瓜。JavaScript的數(shù)字都遵循IEEE754標準構建,在內部都是64位浮點小數(shù)表示郑什,具體可以參見JavaScript中的數(shù)字是如何編碼的.

可以通過使用toFixed()和toPrecision()來解決這個問題府喳。

26、通過for-in循環(huán)檢查對象的屬性

下面這樣的用法蘑拯,可以防止迭代的時候進入到對象的原型屬性中钝满。

JavaScript開發(fā)的40+個經典技巧

27、逗號操作符

JavaScript開發(fā)的40+個經典技巧

28申窘、臨時存儲用于計算和查詢的變量

在jQuery選擇器中弯蚜,可以臨時存儲整個DOM元素。

JavaScript開發(fā)的40+個經典技巧

29剃法、提前檢查傳入isFinite()的參數(shù)

JavaScript開發(fā)的40+個經典技巧

30碎捺、避免在數(shù)組中使用負數(shù)做索引

JavaScript開發(fā)的40+個經典技巧

注意傳給splice的索引參數(shù)不要是負數(shù),當是負數(shù)時贷洲,會從數(shù)組結尾處刪除元素收厨。

31、用JSON來序列化與反序列化

JavaScript開發(fā)的40+個經典技巧

32优构、不要使用eval()或者函數(shù)構造器

eval()和函數(shù)構造器(Functionconsturctor)的開銷較大帽氓,每次調用,JavaScript引擎都要將源代碼轉換為可執(zhí)行的代碼俩块。

JavaScript開發(fā)的40+個經典技巧

33黎休、避免使用with()

使用with()可以把變量加入到全局作用域中,因此玉凯,如果有其它的同名變量势腮,一來容易混淆,二來值也會被覆蓋漫仆。

34捎拯、不要對數(shù)組使用for-in

避免:

JavaScript開發(fā)的40+個經典技巧

而是:

JavaScript開發(fā)的40+個經典技巧

另外一個好處是,i和len兩個變量是在for循環(huán)的第一個聲明中盲厌,二者只會初始化一次署照,這要比下面這種寫法快:

JavaScript開發(fā)的40+個經典技巧

如果傳給setTimeout()和setInterval()一個字符串祸泪,他們將會用類似于eval方式進行轉換,這肯定會要慢些建芙,因此不要使用:

JavaScript開發(fā)的40+個經典技巧

而是用:

JavaScript開發(fā)的40+個經典技巧

35没隘、使用switch/case代替一大疊的if/else

當判斷有超過兩個分支的時候使用switch/case要更快一些,而且也更優(yōu)雅禁荸,更利于代碼的組織右蒲,當然,如果有超過10個分支赶熟,就不要使用switch/case了瑰妄。

36、在switch/case中使用數(shù)字區(qū)間

其實映砖,switch/case中的case條件间坐,還可以這樣寫:

JavaScript開發(fā)的40+個經典技巧

37、使用對象作為對象的原型

下面這樣邑退,便可以給定對象作為參數(shù)竹宋,來創(chuàng)建以此為原型的新對象:

JavaScript開發(fā)的40+個經典技巧

38、HTML字段轉換函數(shù)

JavaScript開發(fā)的40+個經典技巧

39瓜饥、不要在循環(huán)內部使用try-catch-finally

try-catch-finally中catch部分在執(zhí)行時會將異常賦給一個變量逝撬,這個變量會被構建成一個運行時作用域內的新的變量。

切忌:

JavaScript開發(fā)的40+個經典技巧

而應該:

JavaScript開發(fā)的40+個經典技巧

40乓土、使用XMLHttpRequests時注意設置超時

XMLHttpRequests在執(zhí)行時宪潮,當長時間沒有響應(如出現(xiàn)網絡問題等)時,應該中止掉連接趣苏,可以通過setTimeout()來完成這個工作:

JavaScript開發(fā)的40+個經典技巧

同時需要注意的是狡相,不要同時發(fā)起多個XMLHttpRequests請求。

41食磕、處理WebSocket的超時

通常情況下尽棕,WebSocket連接創(chuàng)建后,如果30秒內沒有任何活動彬伦,服務器端會對連接進行超時處理滔悉,防火墻也可以對單位周期沒有活動的連接進行超時處理。為了防止這種情況的發(fā)生单绑,可以每隔一定時間回官,往服務器發(fā)送一條空的消息÷С龋可以通過下面這兩個函數(shù)來實現(xiàn)這個需求歉提,一個用于使連接保持活動狀態(tài),另一個專門用于結束這個狀態(tài)。

JavaScript開發(fā)的40+個經典技巧

keepAlive()函數(shù)可以放在WebSocket連接的onOpen()方法的最后面苔巨,cancelKeepAlive()放在onClose()方法的最末尾版扩。

42、時間注意原始操作符比函數(shù)調用快侄泽,使用VanillaJS

比如礁芦,一般不要這樣:

JavaScript開發(fā)的40+個經典技巧

可以這樣來代替:

JavaScript開發(fā)的40+個經典技巧

43、開發(fā)時注意代碼結構蔬顾,上線前檢查并壓縮JavaScript代碼

別忘了在寫代碼時使用一個代碼美化工具宴偿。使用JSLint(一個語法檢查工具)并且在上線前壓縮代碼(比如使用JSMin)湘捎。注:現(xiàn)在代碼壓縮一般推薦UglifyJS

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末诀豁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窥妇,更是在濱河造成了極大的恐慌舷胜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件活翩,死亡現(xiàn)場離奇詭異烹骨,居然都是意外死亡,警方通過查閱死者的電腦和手機材泄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門沮焕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拉宗,你說我怎么就攤上這事峦树。” “怎么了旦事?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵魁巩,是天一觀的道長。 經常有香客問我姐浮,道長谷遂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任卖鲤,我火速辦了婚禮肾扰,結果婚禮上,老公的妹妹穿的比我還像新娘蛋逾。我一直安慰自己集晚,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布换怖。 她就那樣靜靜地躺著甩恼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上条摸,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天悦污,我揣著相機與錄音,去河邊找鬼钉蒲。 笑死切端,一個胖子當著我的面吹牛,可吹牛的內容都是我干的顷啼。 我是一名探鬼主播踏枣,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钙蒙!你這毒婦竟也來了茵瀑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤躬厌,失蹤者是張志新(化名)和其女友劉穎马昨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扛施,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鸿捧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了疙渣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匙奴。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妄荔,靈堂內的尸體忽然破棺而出泼菌,到底是詐尸還是另有隱情,我是刑警寧澤懦冰,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布灶轰,位于F島的核電站,受9級特大地震影響刷钢,放射性物質發(fā)生泄漏笋颤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一内地、第九天 我趴在偏房一處隱蔽的房頂上張望伴澄。 院中可真熱鬧,春花似錦阱缓、人聲如沸非凌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敞嗡。三九已至颁糟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喉悴,已是汗流浹背棱貌。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留箕肃,地道東北人婚脱。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像勺像,于是被迫代替她去往敵國和親障贸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容