JavaScript 基本技巧
1.盡量少用全局變量
(1)全局變量的說明
- 變量的作用域是以函數(shù)進(jìn)行管理屉符,函數(shù)以外為全局作用域
- 瀏覽器中以windows作為全局對(duì)象本身
(2)隱式產(chǎn)生的全局變量
- 在函數(shù)中不聲明,直接使用的變量株灸,默認(rèn)為全局變量
function func(x,y){
result = x + y; // result 為全局變量
}
- 在函數(shù)中,使用鏈?zhǔn)劫x值
function func(){
var a = b = 0; // b為全局變量 a為局部變量
}
- 嚴(yán)格模式下秒际,在函數(shù)中不聲明變量直接用會(huì)報(bào)錯(cuò)
(3)全局變量的刪除問題
- 在全局作用域下了赵,通過var聲明的變量,不能使用delete刪除
- 在全局作用域下丐吓,不通過var聲明浅悉,直接使用的變量,可以使用delete刪除
- 在函數(shù)作用域下券犁,不通過var聲明术健,直接使用的變量,可以使用delete刪除(嚴(yán)格模式下不允許使用)
(4)單一var模式
只使用一個(gè)var在函數(shù)頂部進(jìn)行變量聲明(最好能賦初值)
function func(){
var a = 1,
b = 2,
sum = a + b,
obj = {},
i,
j,
...
//函數(shù)體
}
- 說明:在函數(shù)中粘衬,默認(rèn)會(huì)將所有變量的聲明語句置頂荞估,因此建議,聲明變量的語句均放置到函數(shù)體頂部
2.for循環(huán)的說明
- 遍歷數(shù)組的長度需要進(jìn)行緩存稚新,可以提高速度
- 變量逐步減至0勘伺,可以提高效率,使用如下:
for(i = length;i--){
//代碼
}
3.for-in循環(huán)的說明
- for-in循環(huán)用于枚舉對(duì)象的所有屬性
- 為了只把自定義屬性枚舉褂删,而不是把所有內(nèi)置屬性枚舉出來娇昙,需要使用hasOwnProperty()方法進(jìn)行篩選,如下:
for(prop in obj){
if(Object.prototype.hasOwnProperty.call(obj,prop)){
//代碼
}
}
4.不要增加內(nèi)置的原型
- 不要為內(nèi)置對(duì)象增加構(gòu)造函數(shù)(Object,Array,Function等)
- 如果需要為原型添加自定義方法,采用如下方式:
if(typeof Object.prototype.method !== "function"){
Object.prototype.method = function () {
//函數(shù)體
}
}
5.switch使用模式
- 每個(gè)case與switch縱向排列整齊
- 每個(gè)case語句使用代碼縮進(jìn)
- 每個(gè)case語句結(jié)尾要有一個(gè)明確的break語句
- 避免使用fall-throughs方式
- 用default作為switch語句的結(jié)束
6.避免使用隱式轉(zhuǎn)換
- 使用 === ,不要使用 ==
7.避免使用eval()
- 如果必須使用eval()函數(shù)笤妙,可以考慮使用new Function() 來代替
8.parseInt()使用
- 使用時(shí)一定不要忽略進(jìn)制參數(shù)
9.編碼約定
(1)縮進(jìn)
- 對(duì)大括號(hào)中的所有代碼執(zhí)行縮進(jìn)
(2)大括號(hào)
- 在可選使用大括號(hào)的情形下冒掌,都使用大括號(hào)
- 為避免解釋器的默認(rèn)行末加分號(hào)的問題,將左大括號(hào)與前一個(gè)語句放在同一行:
if(true){
//TODO
}
function(){
//TODO
}
(3)空格
使用空格的情況列舉如下:
- for循環(huán)各部分的分號(hào)后
- for循環(huán)初始化多個(gè)變量時(shí)蹲盘,每個(gè)聲明后
for (var i = 0, max = 10; i < max; i++)
- 限定數(shù)組股毫,每個(gè)元素逗號(hào)后面
var array = [1, 2, 3];
- 對(duì)象屬性逗號(hào)后,屬性名稱和屬性值之間的冒號(hào)后
var obj = {prop1: value1, prop2: value2};
- 函數(shù)中各參數(shù)后
- 函數(shù)聲明的大括號(hào)之前
function func(a, b, c) {
}
- 匿名函數(shù)表達(dá)式之后
var func = function () {
}
- 建議在操作符后 ( + - * = < > === !== += 等)
- 在大括號(hào)之前使用一個(gè)空格
- 在大括號(hào)之后召衔,如有else if 或者 while 使用一個(gè)空格
命名約定
- 構(gòu)造函數(shù)使用首字母大寫的駝峰命名
function MyConstructor(){
...
}
- 普通方法和變量使用駝峰命名
function myFunction(){
...
}
- 精確常量使用全部大寫(雖然可以更改其值铃诬,但從命名上用于告知)
var PI = 3.14,
MAX_VALUE = 100
- 私有方法使用下劃線加駝峰命名(雖然可以訪問,但從命名上告知不用調(diào)用)
var obj = {
_privateFunc: function () {...}
};
- 受保護(hù)屬性使用一個(gè)下劃線開頭苍凛,私有屬性使用兩個(gè)下劃線開頭
var obj {
_protectProp: value_1,
__privateProp: value_2
};