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