2007年2月 2日

JavaScript 第3版

ひさびさに JavaScript をいじろうと思い、以前に購入して長らく放置していた『JavaScript 第3版』を読みました。これまで見よう見真似でしか触ってこなかった JavaScript をちょっとまじめに勉強しよう、というのが狙いです。

 
もともと、この本はプログラミング言語としての JavaScript が詳しく解説されている、という話をどこかで読んだのがきっかけで購入しました。たしかに全体の半分を占める第I部「コア 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 の言語仕様が簡潔に解説されていることに、本を読み終えてから気づきました。書籍ほど丁寧ではありませんが、重要なポイントが小気味よく解説されているようです。こちらもちゃんと読んでみようと思います。

JavaScript
JavaScript
posted with amazlet on 07.02.02
デイビッド フラナガン David Flanagan 村上 列 垰井 正雄 安藤 進
オライリー・ジャパン
売り上げランキング: 10952