2007年2月 2日
JavaScript 第3版
ひさびさに JavaScript をいじろうと思い、以前に購入して長らく放置していた『JavaScript 第3版』を読みました。これまで見よう見真似でしか触ってこなかった JavaScript をちょっとまじめに勉強しよう、というのが狙いです。
一方、第II部の「クライアントサイド JavaScript」 ではブラウザ上での JavaScript についての各種話題が取り上げられています。しかし、この第3版の日本語版が出たのが2000年12月とかなり古いため、第II部はかなり古めかしい内容となっています。
というわけで、第I部だけを読むことにしました。実は第I部も JavaScript 1.3前後の時代に書かれているため、新しいバージョンで追加された機能 (in 演算子、定数、 getter/setter の定義の方法など) の情報は当然カバーされていないのですが、 JavaScript の基本的な言語仕様についてはしっかり学ぶことができます。
JavaScript にはブロックレベルでのスコープがない (ループの中で変数を宣言しても、ループの外でも見える)、暗黙の型変換、といったはまりがちな点がきちんと押さえられている他、プロトタイプベースのオブジェクト指向、クロージャ、スコープチェーンといった込み入った話題についての解説も充実しています。
読んでいていろいろな発見がありましたが、個人的に特になるほどと思ったのは、以下のような点です。
- 連想配列というものはない。オブジェクトが連想配列として使えるだけ。
- 数値は 64ビットの浮動小数点である。よって 5/2 は 2.5 になる。ただし、ビット演算の際には 32ビットの整数として扱われる。
- == はオブジェクトに対しては、参照が同一かを調べる。よって [1] == [1] は false
- watch を使うと特定のプロパティの書き換えを監視できる
- Object#toSource() を使うとオブジェクトの中身をeval可能なコードで出せる。 o = {foo: 1, bar: 2}; o.toSource() => "({foo:1, bar:2})"
- a[10000] = 1 と配列に代入しても a[0] .. a[9999] のメモリは確保されない
- && と || は真偽値ではなく式の値を返す
- arguments.callee を使うと無名関数でも簡単に再帰が書ける。例: function(x) { return x == 0 ? 1 : x * arguments.callee(x - 1); }
- arguments.caller.callee で呼び出し元関数にアクセスできる、と思いきや、JavaScript 1.5 では廃止されていた。代わりに Function#caller を使う。
まとめ
JavaScript 第3版の日本語版を読みました。後半の内容はだいぶ古くなっていますが、前半の JavaScript の言語仕様の解説は非常にためになりました。原書の方は昨年の8月に第5版が出て、こちらは JavaScript 1.5 に対応しているようです。
ところで、ネット上で読めるCore JavaScript 1.5 Guide には新しい情報も含めて JavaScript の言語仕様が簡潔に解説されていることに、本を読み終えてから気づきました。書籍ほど丁寧ではありませんが、重要なポイントが小気味よく解説されているようです。こちらもちゃんと読んでみようと思います。
オライリー・ジャパン
売り上げランキング: 10952