一、基本フォーマット
インデント
各レベルに4スペースを推奨する。エディタでtab = 4スペースに設定すると自動変換できる。
セミコロン
セミコロンを省略しない。ASI(自動セミコロン挿入)エラーを防ぐため。
行幅
各行のコードは80文字以内に収める。長すぎる場合は演算子を使って手動で改行する。
改行
演算子は前の行の末尾に置き、次の行は2レベルインデントする。代入文の場合は、等号の後の部分に揃える。
空行
関数宣言と関数宣言の間、変数宣言と関数宣言の間、関数内部の論理ブロックの間には、それぞれ空行を挟むべきである。
著者のニコラスはさらに、フロー制御ブロックの先頭に空行を1行残すことを推奨しているが、示されている例はあまり明確ではない。
命名
- 変数名/関数名:キャメル(ラクダ)規則。最初の単語の先頭文字は小文字、以降の単語の先頭文字は大文字、残りは小文字にする。
- 定数名:C言語形式。すべて大文字で、単語間はアンダースコアで区切る。
- コンストラクタ関数:パスカル規則。すべての単語の先頭文字を大文字にし、残りは小文字にする。
リテラル
- 文字列:二重引用符で囲む。改行には[+]演算子を使用し、\エスケープ文字は使用しない。
- 数値:小数点の前後の部分を省略しない。8進数形式を使用しない。
- Null:nullはObjectのプレースホルダとしてのみ扱う。仮引数の検出にも、未初期化の変数の検出にも使用しない。
- Undefined:未定義と未初期化を区別するために、すべてのオブジェクトはnullに初期化するべきである。
- オブジェクトリテラル/配列リテラル:コンストラクタ方式でオブジェクトや配列を宣言しない。
二、コメント
P.S. 本書には非常に有名な説明がある:
Appropriately written comments help tell the story of code, allowing other developers to drop into a part of the story without needing to hear the beginning.
単行コメント
- 行末:1レベルのインデントでコードと区切り、//の後にはスペースを1つ入れる。
- 単独の行:下のコードに対するコメントに使用し、コメント対象のコードと同じインデントを維持する。
- 行頭:複数行のコードをコメントアウトするために使用する。
複数行コメント
大きなコメントブロックを囲むために使用する。Eclipseスタイルを推奨する。例:
/* * comment line1 * comment line2 */
注意:
- 複数行コメントの上には空行を1行残す。
- *アスタリスクの後にはスペースを1つ入れる。
- 複数行コメントは少なくとも3行にする(最初の行と最後の行の後にはコメントを付けないため)。
どこにコメントを付けるか
- 自己説明的でないコード
- 意図的だが、エラーのように見える箇所
- ブラウザ向けのハック
ドキュメントコメント
各関数にコメントを付けるべきである。機能の説明、引数、戻り値、スローされるエラーなどを含める。推奨されるEclipseスタイルの例:
/**
* 添加指定元素到默认数组
*
* @method add
* @param {Number} 将要添加的元素
* @return {Boolean} 添加成功/失败
* @throw {TypeError} 参数类型不匹配
*/
function add(item){
if(typeof item === "number"){
arr.push(item)
}
else{
throw new TypeError();
}
}
三、文と式
中括弧の配置
行末スタイルを推奨し、次行スタイルは推奨しない。
ブロック文のスペース
ifの後の丸括弧の前後にそれぞれスペースを1つ入れる。例:
if (expr) {
code
}
switch文
- インデント:caseはswitchに揃え、breakは1レベルインデントする。
- caseフォールスルー:空行またはコメント//falls throughで、caseフォールスルーが意図的であることを明示する。
- default:defaultを残すか、コメント//no defaultでdefaultが無いことを明示する。
P.S. 『JavaScript言語精粋』の著者ダグラスは、caseフォールスルーを使うべきではないと考えている(「鶏肋」と呼んでいる)。バグを引き起こしやすいからだ。一方ニコラスは、空行やコメントで説明すれば問題ないと考えている。
with文
使用しない。
forループ
すべての変数は関数本体の先頭で宣言すべきである。forループの初期化部分で使用する変数も含む。ホイスティング(巻き上げ)によるバグを避けるためである(グローバル変数を遮蔽する可能性がある)。
for-inループ
配列の走査に使用しない。使用する場合は、hasOwnPropertyによるフィルタリングを忘れずに追加する。意図的にプロトタイプのプロパティを走査する場合は、コメントで説明するべきである。
四、変数、関数、演算子
変数宣言
関数本体 = 変数宣言 + 関数宣言 + ロジック文。各部分は空行で区切る。
関数宣言
先に宣言してから使用する。関数宣言をif分岐の中に置いてはいけない。ブラウザによって解釈が異なり、ESでも標準が定められていないためである。
関数呼び出し
丸括弧の前後にはスペースを入れない。ブロック文と混同しないようにするため。
匿名関数の即時実行
即時実行する匿名関数を丸括弧で囲み、匿名関数の宣言と混同しないようにする。
厳格モード
グローバルスコープで厳格モードを有効にしない。関数内部でのみ有効にする。複数の関数で有効にする場合は、匿名関数の即時実行を使用して厳格モードのスコープを限定できる。
等価性の判定
===と!==のみを使用する。
eval
eval()とnew Function()を使用しない。匿名関数を使用してsetTimeout()とsetInterval()を最適化する。
基本ラッパー型
new Boolean(), new String(), new Number()を使用しない。
参考資料
- 《Maintainable JavaScript》
- 『JavaScript言語精粋』
出典:http://www.codeceo.com/article/javascript-code-style-guide.html