for (var i = 0, elem; elem = elems[i]; i++) { doSomething(elem) }って書き方見やすくていいな

Google JavaScript Style Guide 和訳 — Google JavaScript Style Guide 和訳を読んでみて、知らなかったこととかメモ。

プロパティとメソッド

* Private のプロパティ, 変数, メソッドには, 末尾にアンダースコア _ を付けてください.
* Protected のプロパティ, 変数, メソッドにはアンダースコアを付けないでください (パブリックなものと同様です).

Private と Protected に関しては visibility のセクションを参考にしてください.

プライベートのものにprefixで_で付ける習慣はあったけど、末尾に付けるってのは知らなかった。
こういう書き方あるんですね。

メソッドと関数パラメータ

オプション引数には opt_ というプレフィックスをつけてください.

可変長の引数を取る場合, 最後の引数を var_args と名づけてください. ただし参照する際は var_args ではなく arguments を参照するようにしてください.

オプション引数と可変長引数に関しては @param アノテーションでもコンパイラは正しく解釈してくれます. 両方を同時に用いることが好ましいです.

opt_とかvar_のprefixも初めて見た。これ普通の名前だと何でダメなんだろう?

波括弧

処理系によってセミコロンが暗黙で挿入されるのを防ぐために, かならず開き波括弧は改行せずに同じ行に書いてください.

if (something) {
  // ...
} else {
  // ...
}

最近は

if (something) {
  // ...
}
else {
  // ...
}

の書き方の方が好きなんだけど、JavaScriptの場合セミコロンの暗黙挿入があるかもだから改行しない方がいいのね。

ノードリストのイテレート
代わりにこう書いたほうがベターです:

var paragraphs = document.getElementsByTagName('p');
for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) {
  doSomething(paragraph);
}

これはすべてのコレクション, 配列に対してうまく動きます. 要素がなくなるまでループし, 最後には false となりループが終了します.

これ見やすくていいなと思った。普段だと、

var paragraphs = document.getElementsByTagName('p');
for (var i=0, l=paragraphs.length; i<l; ++i) {
  var paragraph = paragraphs[i];

  doSomething(paragraph);
}

と言う感じでfor文の始めで置き換えてたけど、その必要がなくスッキリ書けるんですね。

追記

代入文が値を返すことを利用した美しいコードで、getElementsByTagNameで取ってきたノードリストのイテレートには有用ですが、以下のような例では初っ端でコケちゃいます><

var list = [0, 1, 2, 3];

for (var i = 0, item; item = list[i]; i++) {
	doSomeThing(item);
}

あー、なるほど。偽になって終了条件になっちゃうのかー。何も考えてなかった。ありがとうございます。

これは、配列が真偽値のfalseとして扱われるものを含まない限り、全てのコレクションや配列に対してうまく働きます。

「ノードリストのときだけ」とか普段意識してfor文書いてないから、結局今まで通りの書き方になっちゃいそうだ。