第 5 版 JavaScript[0]

通称サイ本。やっと読み始めた。けっこう罠がある。まず David Flanagan 氏の原著をそのまま訳したものかと思ったら関数やオブジェクトのリファレンス部分は別冊。サイ本のなかでことあるごとに「詳細はクイックリファレンスを参照しろ」って書いてあるんだけどあまりにもそれが多くて読む気力をそがれる。前提あるなら先に言えよと。まぁプログラミング言語の解説本なんてのは対象にする version によって違ってくるところがあるからこういう分け方はわからなくはないんだけど ( 自然言語でも文法 grammar と語彙集 vocabulary で別々の本になってるのはよくあるよね ) この程度の分量で分けるのはめんどくせーなぁと思った。

で、リファレンスのほうどうすっかなと思ってとりあえず Amazon の中身サーチ (?) で目次見てから判断しようと思ったんだけど最後の 1 ページしか表示されない。そして淡い期待をこめた google book search には meta data しかなかった。で、めんどくせー、もう MDC でいいやとちょっと思った数瞬後にやっぱ実装に依った情報が載ってる本は一冊ないとキツいかもしんないと思いなおした。まぁそのうちポチるだろう。

で、中身なんだけど 1 日で core 部分はいけるかなと思ったら予想外につっこみどころが多くてまだ 3 章 データ型と値までしか読めてない。以下列記。無駄に長いので未来のおれ以外読むことをオススメしない。

  • version
  • jslint
  • Unicode 文字コード
    • で記述するらしい。って言われてもあいまいすぎて困るんだけど。「 Windows 的に考えて UTF-16LE なのか ? いやでも browser というか JavaScript はプラットフォーム関係ないよな…。 Unicode は 16 bit の文字コードが使えるから云々と書いてあるから UCS-2サロゲートペアなしの UTF-16 で記述しろってことなのか… ? いやいやそんな HP ていったら hit point じゃなくて Hewlett Packard だろ !! に通ずるような古典芸はしないだろ」という思考を経たのちに好意的に解釈して UTF-8, UTF-16, UCS-2, UCS-4 あたりは大丈夫なんだろうなぁと思った。ふー。
  • コンテキスト
    • 説明がないみたいなんだけど他のスクリプト言語使ったことのあるひとならともかく JavaScript がプログラミングはじめてです。とかいうひとはさっぱりなんじゃないかと思った。言葉の定義からしなさいってばっちゃも言ってただろー。
    • context 、文脈。最近ぽくいうと空気。ラクダ本だとちゃんとコンテキストの定義がしてあるのでわかんないひとは本屋で立ち読みするか google:Perl コンテキスト で調べるかするといいんじゃないかな。てか google book search が正直わからん…。ラクダ本 volume 2 はあって立ち読みできるのに volume 1 がない。
  • single or double ?
    • quote のハナシ。 double quote では escape sequence を展開してくれるということだけ知ってればいいんだけど自分ルールを決めといた方がいい。おれの場合基本 single かつ escape はなるべく使わない方向。 'foo' や "'" とかって書くけど '\'' て書き方はしないてことね。 Perlbash 使ってたので double は何かを「解釈」するっていうイメージがあってリテラルで書くたんびに裏で何かの処理が走って損してそうという偏見があって single を使うようにしてる。
  • \xXX
    • Latin-1 文字コードを書けるらしい。優遇されてんなぁ。使うことはないと思うけど読むことはあるかもしれないので覚えておくといいかもしれない。
  • object
    • まず Number オブジェクトに toString, toFixed, toExponential, toPrecision てのがあって文字列がほしいときはメソッド呼び出してね、ってのはわかる。そして parseInt, parseFloat てグローバル関数があって数値がほしいときは適用してねてのもわかる。んだけどどっちかに統一するかどっちも使えるかにしたほうがいいんじゃないかなと思う。中途半端感漂うというかなんというか。
    • あと基本データ型の wrapper object て概念はちょっと斜め上だった。 C++ でいうコピーコンストラクタみたいなのを基本データ型だけに適用したようなもんかな。てことは…、と思って 'a,b,c'.split(','); てコードを書いて通るのを確認した。 Ruby ではよく見かける書き方なんだけど JavaScript では見かけないよね。なんでだろ。
    • で、基本データ型から一時オブジェクトが作られるオーバーヘッドを考慮すると速度を上げたい場合は明示的に String や Number, Boolean オブジェクトを作ってやった方がいいのかと思ったんだけどそうでもない ? というのも http://d.hatena.ne.jp/janus_wel/20081103/1225753471 の結果みると明示的にオブジェクト作った方が遅いんだよね。よくわからん。
    • 一番驚いたのが配列から数値への変換だったんだけどコンテキストの概念があるなら Perl の scalar よろしく配列の長さを返してやりゃあいいのにと思った。 length 使えよってハナシで終了なの ?
    • valueOf メソッドは数値を得るためのものじゃなくてそのオブジェクトの自然な表現を返すためのもんだと理解した。そうすると toString, valueOf だけ特別扱いで toNumber とか toBoolean がないのはやっぱりなんか中途半端というかなんというか。
    • 細かい知識では基本データ型の種類を気にせずに wrapper object を得るには Object クラスで new してやればいいとかかな。
  • 未定義値
    • undefined はグローバル変数なだけで予約語ではないということらしい。何を未定義とするのか書く人によって変更できる余地を残したと解釈できないことはないんだけどなんかよくわからん。言語による制約として盛り込んでしまった方がいろいろラクな気がする。
  • 値と参照
    • 絵描いて説明した方がわかりやすいのになぁと思った。頑張って文字で説明しようとしてなんかよくわからないモンになってる。
    • object の操作は参照ベースということでディープコピーするにはどうするのかなと思ったけどすでにあった -> http://blog.livedoor.jp/dankogai/archives/50957890.html 。一番下に書いてあるイヤな点 for in で clone が見えちゃう問題は Iterator 使うとかでなんとか ( http://d.hatena.ne.jp/janus_wel/20081030/1225399006http://d.hatena.ne.jp/janus_wel/20081031/1225399140 の StyleSheet クラスのソース参照 ) 。
    • String メソッドがすべて非破壊的なのはいわれるまで気づかなかった。まぁ replace とかは破壊的な方がわかりやすいのにと思ったことはあったけどこういう裏があったのはしらなんだ。まぁトリビア的なもので実際にはあんまり役に立たないんだけど。
    • そして名言「JavaScript は C, C++, Java より高級な言語」 ktkr 。これは David 氏がすごいのか訳が悪いのかどっちなんだろう。原著読むべきかなぁとちょっとイヤな予感がした。
  • return, break, continue
    • の 3 つは行をまたげないというハナシらしい。まぁ行デリミタなくても動くよっていう言語だからこういうあいまいさは許容すべきなんだろうなー。いやでも 3 項演算子のが連結つえーぞ ? こういうあいまいさは許容すべきなんだろうなー。
function foo() {
    return true;
}

function bar() {
    return
        true;
}

function buz() {
    return 0 == 0
        ? false
        : true;
}

// true
alert(foo());
// undefined
alert(bar());
// false
alert(buz());