一、基本フォーマット

インデント

各レベルに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