「JavaScript の勉強」について個人的に2008年05月23日 08時25分

JavaScript の『本気』な勉強 - daily dayflower」での質問に横から勝手に答えちゃいます。

初学者の入り口として既存のライブラリを使うのは
どちらかというと望ましい。ブラウザのイベント周りの非互換性など、JavaScript と関係ない部分で悩まずにすむのは便利だと思います。
(初学者であれ) JavaScript の仕様に沿ったメカニズムについて
学習すべきである。いきなり ECMAScript 仕様を読めというつもりはありませんが、体系的な学習はしたほうがいいかと。
DOM 構築後のスクリプト実行についてどう教える?
ライブラリを使うならそのライブラリの機能を使って、使わないなら body 要素の内容の終端に script 要素をおくか、もしくは load イベントのイベントリスナで。
自分で書く場合
自家製ライブラリを利用している。今度このブログのレイアウトを変更するときには jQuery を使ってみようかなとも思っていますが。

書いていて思ったのですが、これはプログラミングとアプリケーション開発という軸からすれば、プログラミングよりの視点ですね。同じ視点からすれば、DOM/BOM は基礎というよりも応用であり、「W3C DOM等(基礎知識を)知りませーん」という人を「JavaScriptを本気で勉強した人」といえるかと問われれば「いえる」と思います。

Perl ライブラリ jcode.plCGI での使用が最も多かったでしょうが、作者の歌代さんは (少なくとも CGI 普及期には) 一度も CGI を書いたことがなかったそうです。Web ブラウザでのクライアントサイドスクリプティングは、JavaScript の最大の利用箇所ではあっても唯一の利用箇所ではありません。「JavaScript の勉強」といった場合、ブラウザにとらわれることはないと私は考えています (dayflower さんの質問とだいぶずれていますが)。

行数の数え方2008年05月23日 11時56分

行数を数えているのですが、コメント欄他のstr.split(/\n/).lengthはかっこいいけどoverkill

404 Blog Not Found:javascript - String.prototype.tr() released

本当でしょうか? 実際に試してみましょう。変数 s が対象文字列を指しているものとします。

// charAt
var lines = 1;
for (var i = 0, n = s.length; i < n; i++)
  if (s.charAt(i) == "\n")
    lines++;
// Array
var lines = 1;
var chars = s.split("");
for (var i = 0, n = chars.length; i < n; i++)
  if (chars[i] == "\n")
    lines++;
// split
var lines = s.split("\n").length;
// match
var lines = (s.match(/\n/g) || []).length + 1;
// match (番兵)
var lines = (s + "\n").match(/\n/g).length;
// indexOf
var lines = 1;
var i = -1;
while ((i = s.indexOf("\n", i + 1)) >= 0)
  lines++;
// replace
var lines = s.length - s.replace(/\n/g, "").length + 1;
行数カウントの実行時間 (10000 回、単位はミリ秒)
改行を含む文字列 改行を含まない文字列
SpiderMonkey 1.8 JScript 5.7 SpiderMonkey 1.8 JScript 5.7
charAt 468 1656 389 1360
Array 463 1047 382 859
split 108 172 78 63
match 502 203 73 78
match (番兵) 543 250 185 110
indexOf 95 250 13 31
replace 446 94 82 62

見ての通り、charAt メソッドで一文字ずつチェックしていくよりも、split メソッドを使ったほうが実行速度は速くなります。特に JScript ではその差が顕著です。

ところで、JavaScript は高級言語であり、一般の JavaScript 処理系ではソースコードの解釈・実行時に多くの最適化がなされます。最適化技術は日々進歩しており、今日一番速かった書き方が明日もそうである保証はどこにもありません。アルゴリズムから変えるとかならともかく、下手に速度を求めて変な書き方をするよりは簡潔な書き方を心がけたほうがいいと思います。