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ù)據類型刽沾,這也使得它們要比==和!=快。
3排拷、underfined侧漓、null、0监氢、false布蔗、NaN、空字符串的邏輯結果均為false
4浪腐、行尾使用分號
實踐中最好還是使用分號纵揍,忘了寫也沒事,大部分情況下JavaScript解釋器都會自動添加议街。對于為何要使用分號骡男,可參考文章JavaScript中關于分號的真相。
5傍睹、使用對象構造器
6隔盛、小心使用typeof、instanceof和contructor
- typeof:JavaScript一元操作符拾稳,用于以字符串的形式返回變量的原始類型吮炕,注意,typeofnull也會返回object访得,大多數(shù)的對象類型(數(shù)組Array龙亲、時間Date等)也會返回object
- contructor:內部原型屬性,可以通過代碼重寫
- instanceof:JavaScript操作符悍抑,會在原型鏈中的構造器中搜索鳄炉,找到則返回true,否則返回false
7搜骡、使用自調用函數(shù)
函數(shù)在創(chuàng)建之后直接自動執(zhí)行拂盯,通常稱之為自調用匿名函數(shù)(Self-InvokedAnonymous Function)或直接調用函數(shù)表達式(ImmediatelyInvoked Function Expression )。格式如下:
8记靡、從數(shù)組中隨機獲取成員
9谈竿、獲取指定范圍內的隨機數(shù)
這個功能在生成測試用的假數(shù)據時特別有數(shù)团驱,比如介與指定范圍內的工資數(shù)。
10空凸、生成從0到指定值的數(shù)字數(shù)組
varnumbersArray =[],max =100;for(vari=1;numbersArray.push(i++)<max;); //numbers = [1,2,3 ... 100]
11嚎花、生成隨機的字母數(shù)字字符串
12、打亂數(shù)字數(shù)組的順序
這里使用了JavaScript內置的數(shù)組排序函數(shù)呀洲,更好的辦法是用專門的代碼來實現(xiàn)(如Fisher-Yates算法)紊选,可以參見StackOverFlow上的這個討論。
13道逗、字符串去空格
Java丛楚、C#和PHP等語言都實現(xiàn)了專門的字符串去空格函數(shù),但JavaScript中是沒有的憔辫,可以通過下面的代碼來為String對象函數(shù)一個trim函數(shù):
新的JavaScript引擎已經有了trim()的原生實現(xiàn)趣些。
14、數(shù)組之間追加
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ù)組
16坏平、驗證是否是數(shù)字
17、驗證是否是數(shù)組
但如果toString()方法被重寫過得話锦亦,就行不通了舶替。也可以使用下面的方法:
如果在瀏覽器中沒有使用frame,還可以用instanceof杠园,但如果上下文太復雜顾瞪,也有可能出錯。
18抛蚁、獲取數(shù)組中的最大值和最小值
19陈醒、清空數(shù)組
20、不要直接從數(shù)組中delete或remove元素
如果對數(shù)組元素直接使用delete瞧甩,其實并沒有刪除钉跷,只是將元素置為了undefined。數(shù)組元素刪除應使用splice肚逸。
切忌:
而應:
刪除對象的屬性時可以使用delete爷辙。
21、使用length屬性截斷數(shù)組
前面的例子中用length屬性清空數(shù)組朦促,同樣還可用它來截斷數(shù)組:
與此同時膝晾,如果把length屬性變大,數(shù)組的長度值變會增加务冕,會使用undefined來作為新的元素填充血当。length是一個可寫的屬性。
22、在條件中使用邏輯與或
邏輯或還可用來設置默認值歹颓,比如函數(shù)參數(shù)的默認值坯屿。
23油湖、使得map()函數(shù)方法對數(shù)據循環(huán)
24巍扛、留指定小數(shù)位數(shù)
注意,toFixec()返回的是字符串乏德,不是數(shù)字撤奸。
25、浮點計算的問題
為什么呢喊括?因為0.1+0.2等于0.30000000000000004胧瓜。JavaScript的數(shù)字都遵循IEEE754標準構建,在內部都是64位浮點小數(shù)表示郑什,具體可以參見JavaScript中的數(shù)字是如何編碼的.
可以通過使用toFixed()和toPrecision()來解決這個問題府喳。
26、通過for-in循環(huán)檢查對象的屬性
下面這樣的用法蘑拯,可以防止迭代的時候進入到對象的原型屬性中钝满。
27、逗號操作符
28申窘、臨時存儲用于計算和查詢的變量
在jQuery選擇器中弯蚜,可以臨時存儲整個DOM元素。
29剃法、提前檢查傳入isFinite()的參數(shù)
30碎捺、避免在數(shù)組中使用負數(shù)做索引
注意傳給splice的索引參數(shù)不要是負數(shù),當是負數(shù)時贷洲,會從數(shù)組結尾處刪除元素收厨。
31、用JSON來序列化與反序列化
32优构、不要使用eval()或者函數(shù)構造器
eval()和函數(shù)構造器(Functionconsturctor)的開銷較大帽氓,每次調用,JavaScript引擎都要將源代碼轉換為可執(zhí)行的代碼俩块。
33黎休、避免使用with()
使用with()可以把變量加入到全局作用域中,因此玉凯,如果有其它的同名變量势腮,一來容易混淆,二來值也會被覆蓋漫仆。
34捎拯、不要對數(shù)組使用for-in
避免:
而是:
另外一個好處是,i和len兩個變量是在for循環(huán)的第一個聲明中盲厌,二者只會初始化一次署照,這要比下面這種寫法快:
如果傳給setTimeout()和setInterval()一個字符串祸泪,他們將會用類似于eval方式進行轉換,這肯定會要慢些建芙,因此不要使用:
而是用:
35没隘、使用switch/case代替一大疊的if/else
當判斷有超過兩個分支的時候使用switch/case要更快一些,而且也更優(yōu)雅禁荸,更利于代碼的組織右蒲,當然,如果有超過10個分支赶熟,就不要使用switch/case了瑰妄。
36、在switch/case中使用數(shù)字區(qū)間
其實映砖,switch/case中的case條件间坐,還可以這樣寫:
37、使用對象作為對象的原型
下面這樣邑退,便可以給定對象作為參數(shù)竹宋,來創(chuàng)建以此為原型的新對象:
38、HTML字段轉換函數(shù)
39瓜饥、不要在循環(huán)內部使用try-catch-finally
try-catch-finally中catch部分在執(zhí)行時會將異常賦給一個變量逝撬,這個變量會被構建成一個運行時作用域內的新的變量。
切忌:
而應該:
40乓土、使用XMLHttpRequests時注意設置超時
XMLHttpRequests在執(zhí)行時宪潮,當長時間沒有響應(如出現(xiàn)網絡問題等)時,應該中止掉連接趣苏,可以通過setTimeout()來完成這個工作:
同時需要注意的是狡相,不要同時發(fā)起多個XMLHttpRequests請求。
41食磕、處理WebSocket的超時
通常情況下尽棕,WebSocket連接創(chuàng)建后,如果30秒內沒有任何活動彬伦,服務器端會對連接進行超時處理滔悉,防火墻也可以對單位周期沒有活動的連接進行超時處理。為了防止這種情況的發(fā)生单绑,可以每隔一定時間回官,往服務器發(fā)送一條空的消息÷С龋可以通過下面這兩個函數(shù)來實現(xiàn)這個需求歉提,一個用于使連接保持活動狀態(tài),另一個專門用于結束這個狀態(tài)。
keepAlive()函數(shù)可以放在WebSocket連接的onOpen()方法的最后面苔巨,cancelKeepAlive()放在onClose()方法的最末尾版扩。
42、時間注意原始操作符比函數(shù)調用快侄泽,使用VanillaJS
比如礁芦,一般不要這樣:
可以這樣來代替:
43、開發(fā)時注意代碼結構蔬顾,上線前檢查并壓縮JavaScript代碼
別忘了在寫代碼時使用一個代碼美化工具宴偿。使用JSLint(一個語法檢查工具)并且在上線前壓縮代碼(比如使用JSMin)湘捎。注:現(xiàn)在代碼壓縮一般推薦UglifyJS