使用制表符進行縮進,推薦使用 4 個空格字符作為一個縮進層級。
建議每條語句以分號結尾,雖然
JavaScript
有自動分號插入(ASI) 機制,但是它的插入規則非常復雜難以記住,所以不推薦省略分號。為了代碼的可讀性,建議將一行代碼的長度保持在 80 字符以內。
-
當代碼達到了單行最大字符限制時,需要將代碼手動拆成兩行,通常在元算符換行的時候,下一行最好增加兩個層級的縮進。
callFunction(elementOne, elementTwo, elementThree, elementFour, elementFive);
而且最好將一個運算符放置到行尾,這樣的話,ASI
就不會自作主張的在行尾添加分號,也就避免了錯誤的發生。當然如果是在給變量賦值的時候換行,那么第二行的位置應當和賦值運算符的位置保持對齊。
var result = elementOne + elementTwo + elementThree +
elementFive;
- 合理的使用空行將讓你的代碼更加易于閱讀。在以下場景中添加空行是非常不錯的主意。
- 在方法之間
- 在方法中的局部變量和第一條語句之間
- 在單行或多行注釋之前
- 在方法的邏輯片段之間
下面是以上原則的實踐。
if (true) {
for (var i = 0; i < Things.length; i++) {
var p = 1,
q = 2;
if (true) {
}
}
}
命名是一門藝術,更是一門技術,通常來講命名長度應當盡可能的短,并且抓住要點。為變量命名時,其前綴應該是名詞。為函數命名時前綴應當是動詞,比如
can, has, is, set, get
等。對于常量的命名,最好使用大寫字母和下劃線的組和來命名,比如說MAX_LENGTH
。-
null
是一個特殊值,但是千萬不要和undefined
搞混,在下列場景中應當使用null
。用來初始化一個變量,這個變量可能賦值為一個對象。
var person = null;-
用來和一個已經初始化的變量比較,這個變量可以是也可以不是一個對象。
var person = getPerson();if (person !== null) { doSomething(); }
-
當函數的參數期望是對象時,用作參數傳入。
function printPerson(person) {
if (person !== null) {// print person } } printPerson(null);
當函數的返回值期望是對象時,用作返回值傳出。
function getPerson() {
if (condition) {
return new Person("Hwaphon");
} else {
return null;
}
}
-
我們通常將
undefined
和null
搞混, 那是因為undefined == null
的結果是true
, 然而這二者的用途卻各有不同。那些沒有被初始化的變量都有一個初始值,即defined
, 表示這個變量等待被賦值。有一點值得注意的是,用typeof
去檢測變量,如果這個變量聲明了沒有初始化會返回undefined
, 二如果這個變量根本就沒聲明也會返回undefined
。
var person;console.log(typeof person); // undefined console.log(typeof animal); // undefined
-
JavaScrtipt
支持兩種不同類型的注釋,單行注釋和多行注釋。關于單行注釋,有三種使用方式。-
獨占一行的注釋,用來解釋下一行代碼。這行注釋之前總是有一個空行,且縮進層級和下一行代碼保持一致。
if (condition) {// This is a single line comment doSomething(); }
在代碼行的尾部進行注釋。 代碼結束到注釋之間至少有一個縮進。注釋(包括之前的代碼部分)不應該超過但行的最大字符數( 80 ) 限制,如果超過了,就將這條注釋放置于當前代碼行的上方。
if (condition) {
doSomething(); // This is a single line comment
}被注釋掉的是一大段代碼。
// if (condition) {
// doSomething();
// }
-
關于多行注釋,,是通過 /* */
來實現的,不過最好還是使用下面這樣的風格實現多行注釋。
/*
* First line
* Second line
* Third line
*/
至于什么時候使用注釋,有一條指導原則,當代碼不夠清晰時添加注釋,而當代碼很明了時不應當添加注釋。在以下情況會最好添加注釋。
- 難于理解的代碼
- 可能被誤認為錯誤的代碼
- 瀏覽器特性 hack
使用
if
或者for
語句時,不論塊語句包含多行代碼還是單行代碼,都應當使用花括號。-
在
switch
語句中, 盡量不要使用case
語句的連續執行,如果非要使用的話,最好添加注釋。至于default
, 即使其什么都不做,最好也不腰省略,比如下面這樣。
switch(condition) {
case "first":
break;case "second": break; default: // no logic here }
盡量不要使用
continue
, 用if
語句替代continue
的功能。for-in
循環是用來遍歷對象屬性的,可是存在一個問題,它不僅遍歷對象的實例屬性,同樣還遍歷從原型繼承來的屬性。 所以最好使用hasOwnProperty()
方法來為for-in
循環過濾出實例屬性。推薦在函數頂部使用單
var
語句聲明接下來可能會使用到的變量,而且沒有初始值的變量應該出現在var
語句的尾部。推薦先聲明函數再使用函數。
不推薦使用全局的嚴格模式,推薦使用局部的嚴格模式。
-
將
CSS
從JavaScript
中分離,當需要通過JavaScript
來修改元素樣式的時候,最佳的方法是操作CSS
的className
。
// original style
element.className += " className";// HTML5 style element.classList.add("className");
將
JavaScript
從HTML
中抽離。可以自己創造一個addListener()
函數添加行為,而不是在HTML
結構中使用onclick
之類的內嵌JavaScript
代碼。
function addListener(target, type, handler) {
if (target.addEventListener) {
target.addEventListener(type, handler, false);
} else if(target.attachEvent) {
target.attachEvent("on" + type, handler);
} else {
target["on" + type] = handler;
}
}用
typeof
檢測原始值, 用instanceof
檢測引用值。 在使用這兩個運算符的時候不要加括號,那樣會讓它們看起來像函數。檢測函數最好使用typeof
,下面是檢測數組的一種方法。
function isArray(value) {
if (typeof Array.isArray === "function") {
return Array.isArray(value);
} else {
return Object.prototype.toString.call(value) === "[object Array]";
}
}-
對于一個對象,如果你想檢測某個屬性是否存在,有以下兩種方式。
var person = {
name: "hwaphon",
age: 21
};// Example one if ("name" in person) { console.log("Exsits"); } // Example two if (person.hasOwnProperty("name")) { console.log("Exsits"); }