kwsktr's study log

kwsktr のおべんきょログ

久しぶりに JavaScript 本読んだらいろいろ刺激された :: 「JavaScriptクックブック」

ここ数ヶ月は、読書というと ActionScript 関係ばかりで、モニョモニョしてました。
「なぜ、いま、ActionScript」なのかというと、Flash コンテンツを作るお仕事をしてたからに他なりません。
Flash でプログラム言語というと == ActionScript だったので、関連書籍を読み漁っていました。ちょっと齧ったことのある JavaScript と同じ ECMAScript とはいえ、ActionScript は一度も利用したことがない言語だったので、興味を持って学ぶことができました。
一緒にお仕事をする人のレベルが超初心者だったこともあり、「なるべく ActionScript を使わない」「使うならば、しっかりと説明ができるコードを書く」という方針を立てていたこともあり、じっくりと学んでいるところです。


そんな感じで迎えた9月の二回目の三連休、自宅で書庫を眺めていると JavaScript の本が未読のまま積まれているのに気づきました。
と、いうことで手にとったのが『JavaScriptクックブック』。


本の構成とか

O'Reilly Japan - JavaScriptクックブック

はじめに

1章 JavaScript文字列の操作

はじめに
レシピ1.1 複数の文字列を連結する
レシピ1.2 文字列と別のデータ型を連結する
レシピ1.3 条件に基づいて文字列を比較する
レシピ1.4 文字列内で部分文字列を検索する
レシピ1.5 文字列から部分文字列を取り出す
レシピ1.6 文字列が存在し、空でないことを調べる
レシピ1.7 キーワード文字列を個々のキーワードに分割する
レシピ1.8 特殊文字を挿入する
レシピ1.9 textareaを1行ずつ処理する
レシピ1.10 文字列から前後のホワイトスペースを削除する
レシピ1.11 文字列の左右にパディングを施す

2章 正規表現の使用

はじめに
レシピ2.1 部分文字列が存在するかどうかをテストする
レシピ2.2 大文字と小文字を区別しない部分文字列マッチングをテストする
レシピ2.3 社会保障番号を検証する
レシピ2.4 パターンのインスタンスをすべて検出してハイライト表示する
レシピ2.5 パターンを新しい文字列と置き換える
レシピ2.6 キャプチャを使って文字列内の単語を入れ替える
レシピ2.7 正規表現を使ってホワイトスペースを削除する
レシピ2.8 HTMLタグを名前付きエンティティと置き換える
レシピ2.9 特殊文字を検索する

3章 日付、時間、タイマー

はじめに
レシピ3.1 今日の日付を表示する
レシピ3.2 日時をUTCで出力する
レシピ3.3 ISO 8601表記の日付を出力する
レシピ3.4 ISO 8601表記の日付をDateオブジェクトに適した形式に変換する
レシピ3.5 特定の日付を作成する
レシピ3.6 未来の日付をスケジュールする
レシピ3.7 経過時間を追跡する
レシピ3.8 タイムアウトを作成する
レシピ3.9 繰り返し実行するタイマーを作成する
レシピ3.10 タイマーで関数クロージャを使う

4章 数字と算術演算の処理

はじめに
レシピ4.1 増分カウンタを管理する
レシピ4.2 10進数値を16進数値に変換する
レシピ4.3 乱数ジェネレータを作成する
レシピ4.4 色をランダムに生成する
レシピ4.5 テーブルの中の文字列を数値に変換する
レシピ4.6 テーブル列のすべての数値を合計する
レシピ4.7 度数とラジアンの間で変換を行う
レシピ4.8 ページ要素に収まる円の半径と中心を割り出す
レシピ4.9 円弧の長さを計算する

5章 配列とループの操作

はじめに
レシピ5.1 配列をループにかける
レシピ5.2 多次元配列を作成する
レシピ5.3 配列から文字列を作成する
レシピ5.4 配列をソートする
レシピ5.5 値を受け取った順序で格納し、アクセスする
レシピ5.6 値を受け取った順序で格納し、逆の順序でアクセスする
レシピ5.7 新しい配列を既存の配列のサブセットとして作成する
レシピ5.8 配列内を検索する
レシピ5.9 多次元配列を1次元配列にする
レシピ5.10 配列要素を検索して削除または置換する
レシピ5.11 各配列要素に関数を適用する
レシピ5.12 すべての配列要素に関数を適用し、新しい配列を返す
レシピ5.13 フィルタリングされた配列を作成する
レシピ5.14 配列の内容を検証する
レシピ5.15 連想配列を使ってフォーム要素の名前と値を格納する

6章 JavaScript関数の再利用

はじめに
レシピ6.1 再利用可能なコードブロックを作成する
レシピ6.2 関数との間で1つのデータ値をやり取りする
レシピ6.3 引数として複雑なデータオブジェクトを使う
レシピ6.4 動的なランタイム関数を作成する
レシピ6.5 関数を引数として渡す
レシピ6.6 再帰アルゴリズムを実装する
レシピ6.7 状態を記憶する関数を作成する
レシピ6.8 汎用カリー化関数を使ってアプリケーションのパフォーマンスを改善する
レシピ6.9 メモ化を使ってアプリケーションのパフォーマンスを改善する
レシピ6.10 匿名関数を使ってグローバル変数をラッピングする

7章 イベントの処理

はじめに
レシピ7.1 ページの読み込みが完了したことを検知する
レシピ7.2 イベントオブジェクトを使ってマウスクリックイベントの位置を捕捉する
レシピ7.3 再利用可能な汎用イベントハンドラ関数を作成する
レシピ7.4 状況の変化に応じてイベントを取り消す
レシピ7.5 イベントが入れ子の要素伝いに引き渡されないようにする
レシピ7.6 キーボードアクティビティを捕捉する
レシピ7.7 HTML5の新しいドラッグ&ドロップ機能を使う
レシピ7.8 Safariの回転イベントと他のモバイル開発環境を使う

8章 ブラウザの構成要素

はじめに
レシピ8.1 Webページのユーザーにアクションの確認を求める
レシピ8.2 無駄なものを省いた新しいブラウザウィンドウを作成する
レシピ8.3 ページにアクセスするブラウザについて調べる
レシピ8.4 Webページからの移動についてページのユーザーに警告する
レシピ8.5 色のサポートに応じてスタイルシートを変更する
レシピ8.6 ページサイズに応じて画像サイズを変更する
レシピ8.7 CMSテンプレートページでパンくずを作成する
レシピ8.8 動的なページをブックマークする
レシピ8.9 状態の保存を戻るボタンとページの更新に対応させる

9章 フォームの要素と検証

はじめに
レシピ9.1 フォームのテキスト入力の値にアクセスする
レシピ9.2 フォーム要素を動的に有効または無効にする
レシピ9.3 イベントに基づいてフォーム要素から情報を取得する
レシピ9.4 ラジオボタンがクリックされたときにアクションを実行する
レシピ9.5 電話番号の有効性を確認する
レシピ9.6 フォームのサブミットを中止する
レシピ9.7 フォームのサブミットを重複させない
レシピ9.8 フォーム要素を表示または非表示にする
レシピ9.9 フォーム上でのアクションに基づいて選択リストを変更する

10章 デバッグとエラー処理

はじめに
レシピ10.1 JavaScriptがサポートされない状況にうまく対処する
レシピ10.2 関数のエラーをチェックする
レシピ10.3 単純なデバッグとしてアラートを使う
レシピ10.4 エラーを捕捉して適切に処理する
レシピ10.5 処理しやすいエラーを発生させる
レシピ10.6 FirefoxFirebugを使う
レシピ10.7 Firebugを使ってブレークポイントを設定し、データを調べる
レシピ10.8 Firefoxとコンソール
レシピ10.9 Internet Explorerの組み込みデバッガを使う
レシピ10.10 Internet Explorerの開発者ツールを使ってブレークポイントを設定する
レシピ10.11 OperaのDragonfly
レシピ10.12 Dragonflyを使ってブレークポイントを設定する
レシピ10.13 Safariの開発者ツールを有効にする
レシピ10.14 Safariのデバッガを使ってブレークポイントを設定する
レシピ10.15 Chromeデバッグする

11章 ページ要素へのアクセス

はじめに
レシピ11.1 特定の要素にアクセスし、その親要素と子要素を調べる
レシピ11.2 Webページ内のすべての画像にアクセスする
レシピ11.3 article要素の画像をすべて検索する
レシピ11.4 Selectors APIを使ってarticle要素の画像をすべて検索する
レシピ11.5 要素グループの親要素を検索する
レシピ11.6 すべての要素で最初の段落をハイライト表示する
レシピ11.7 <ul>にストライプテーマを適用する
レシピ11.8 特定のクラス名を持つすべての要素を配列にまとめる
レシピ11.9 ある属性を共有する要素をすべて検索する
レシピ11.10 選択されたオプションをすべて取得する
レシピ11.11 テーブル行のすべての値を合計する
レシピ11.12 要素の属性を取得する
レシピ11.13 要素のスタイル情報を取得する

12章 要素と属性の作成と削除

はじめに
レシピ12.1 innerHTMLを使ってコンテンツをすばやく簡単に追加する
レシピ12.2 ページの既存の要素の前に要素を挿入する
レシピ12.3 ページの最後に新しい要素を追加する
レシピ12.4 Internet Explorerの古いバージョンで新しい要素のスタイルを設定する
レシピ12.5 新しい段落を挿入する
レシピ12.6 新しい段落にテキストを追加する
レシピ12.7 既存の要素に属性を追加する
レシピ12.8 Boolean属性を評価する
レシピ12.9 属性を削除する
レシピ12.10 段落を移動する
レシピ12.11 リンクを脚注の箇条書きに置き換える
レシピ12.12 既存のテーブルに行を追加する
レシピ12.13 div要素から段落を削除する
レシピ12.14 HTMLテーブルから行を削除する
レシピ12.15 要素のCSSスタイルプロパティを変更する

13章 Webページ空間の操作

はじめに
レシピ13.1 Webページの領域を割り出す
レシピ13.2 要素を測定する
レシピ13.3 ページ内の要素の位置を確認する
レシピ13.4 ページの一部を非表示にする
レシピ13.5 たたみ込み可能なフォームセクションを作成する
レシピ13.6 ページオーバーレイを追加する
レシピ13.7 タブページを作成する
レシピ13.8 マウスホバーで表示されるポップアップ情報ウィンドウを作成する
レシピ13.9 サイドバーのたたみ込みとサイズ変更

14章 対話性とアクセシビリティ

はじめに
レシピ14.1 非表示のページセクションを表示する
レシピ14.2 アラートメッセージを作成する
レシピ14.3 データが正しく設定されていないフォームフィールドをハイライト表示する
レシピ14.4 ページオーバーレイにキーボードアクセシビリティを追加する
レシピ14.5 たたみ込み可能なフォームセクションを作成する
レシピ14.6 カラーフラッシュでアクションを示す
レシピ14.7 タブページにARIA属性を追加する
レシピ14.8 ライブリージョン

15章 メディアを活かした対話型アプリケーションの作成

はじめに
レシピ15.1 Canvasで基本的な図形を作成する
レシピ15.2 Internet ExplorerCanvasアプリケーションを実行する
レシピ15.3 Canvasに動的な折れ線グラフを描画する
レシピ15.4 JavaScriptSVGファイルに追加する
レシピ15.5 WebページのスクリプトからSVGにアクセスする
レシピ15.6 Internet ExplorerSVGをエミュレートする
レシピ15.7 HTMLに対話型のSVGを埋め込む
レシピ15.8 数学関数を使ってSVGでリアルなアナログ時計を作成する
レシピ15.9 SVGcanvas要素をHTMLに組み込む
レシピ15.10 FirefoxWebKit/SafariWebGLのサポートを有効にする
レシピ15.11 オーディオファイルの再生中にルーチンを実行する
レシピ15.12 video要素を使ってJavaScriptからビデオを制御する

16章 JavaScriptオブジェクト

はじめに
レシピ16.1 基本のJavaScriptオブジェクトを定義する
レシピ16.2 オブジェクトのメンバをプライベートにする
レシピ16.3 オブジェクトをプロトタイプで拡張する
レシピ16.4 オブジェクトにゲッターとセッターを追加する
レシピ16.5 オブジェクトの機能を継承する
レシピ16.6 新しいプロパティを定義してオブジェクトを拡張する
レシピ16.7 オブジェクトのプロパティを列挙する
レシピ16.8 オブジェクトの拡張性を抑制する
レシピ16.9 オブジェクトへの追加やプロパティデスクリプタの変更を阻止する
レシピ16.10 オブジェクトへの変更を阻止する
レシピ16.11 1回限りのオブジェクトとJavaScript名前空間を実装する
レシピ16.12 Prototype.bindで"this"を再発見する
レシピ16.13 オブジェクトのメソッドを数珠つなぎにする

17章 JavaScriptライブラリ

はじめに
レシピ17.1 コードをパッケージ化する
レシピ17.2 コードをJsUnitでテストする
レシピ17.3 ライブラリをミニファイする
レシピ17.4 ライブラリをホストする
レシピ17.5 外部ライブラリ:jQueryフレームワークを使う
レシピ17.6 既存のjQueryプラグインを使う
レシピ17.7 ライブラリをjQueryプラグインに変換する
レシピ17.8 アプリケーションで複数のライブラリを安全に組み合わせる

18章 通信

はじめに
レシピ18.1 XMLHttpRequestオブジェクトにアクセスする
レシピ18.2 データを送信するための準備
レシピ18.3 クエリ呼び出しの種類を特定する
レシピ18.4 Ajaxリクエストにコールバック関数を追加する
レシピ18.5 エラー状態を調べる
レシピ18.6 テキストの結果を処理する
レシピ18.7 Ajaxリクエストを別のドメインに送信する
レシピ18.8 サーバーの選択リストを設定する
レシピ18.9 タイマーを使ってページを新しいデータで自動的に更新する
レシピ18.10 postMessageを使ってウィンドウ間で通信する

19章 構造化データの処理

はじめに
レシピ19.1 Ajax呼び出しから返されたXMLドキュメントを処理する
レシピ19.2 XMLツリーから関連情報を取り出す
レシピ19.3 JSONを使ってJavaScriptオブジェクトを生成する
レシピ19.4 JSONフォーマットの文字列を解析する
レシピ19.5 JSONを使ってオブジェクトを文字列に変換する
レシピ19.6 hCalendarアノテーションCanvasのタイムラインに変換する
レシピ19.7 RDFプラグインを使ってページのRDFaをJSONに変換する

20章 永続性

はじめに
レシピ20.1 永続情報をURLに追加する
レシピ20.2 ページ間で情報を維持するためのCookieを作成する
レシピ20.3 history.pushStateメソッドとwindow.onpopstateを使って情報を維持する
レシピ20.4 クライアント側のストレージとしてsessionStorageを使う
レシピ20.5 クライアント側でlocalStorageデータストレージアイテムを作成する
レシピ20.6 リレーショナルデータストアを使ってデータを永続化する

21章 アウトサイドJavaScript

はじめに
レシピ21.1 ブラウザのアドオン、プラグイン、拡張機能を作成する
レシピ21.2 デスクトップウィジェットとモバイルウィジェットを作成する
レシピ21.3 PhoneGapを使ってJavaScriptアプリケーションを作成する
レシピ21.4 JavaScriptを使ってツールを拡張する
レシピ21.5 Web WorkersとFile APIを使ってデスクトップアプリケーションを作成する


索引

勝手に描いた対象読者

ざっくりと目を通した感想でしかありませんが、これからプログラムを始めるレベルの方が最初に読む本ではないと思います。確かに、各レシピは、問題・解答・解説・参照 で構成されていて、なかでも解説の部分に5割から7割のボリュームがあるので、丁寧だし解りやすい作りでになっています。
「解答」通りにコードを書けば、確かに「問題」を解決できますが……超初心者の方は他に学ぶことがあるように思います。
下記二冊は、JavaScript 初学者には特にお勧めです。




頑張れる人は、初学者向けと一緒に買っても良いかも知れません。
ですが、個人的には『JavaScriptパターン ―優れたアプリケーションのための作法』を勧めるかも。


コレを手元において学習すると、良い JavaScript プログラマーになれると思います。
ググりながら学習するのは悪いこととは言いませんが、やっぱり信頼のおける一冊を手にしながら学ばれたほうがいいですよ。


ボク自身は悪いプログラマーなので、最初から良本が存在している環境で学べる人たちが羨ましいです。35歳超えてから、「良いプログラムの書き方」を学ぼうとしても、「悪い癖」のほうが身体と脳みそに染み込んでいるので……いろいろ厳しいんです。

本書の感想 とか

Oreilly の クックブックは、恐らく本書しか所有していないのですが読み応えがある本でした。いわゆる レシピ本なので、この本が絶対に必要な一冊というわけではないのですが、同様の書籍と比べると解説が丁寧なのが良いポイントです。
レシピ内容も多岐に渡っているので、とりあえず気になったら買ってみてもハズレが少ないと思います。
ひと通り目を通して感じるのは、ここまで数多くのレシピがあるのも JavaScript という言語の持つ柔軟性というか多様性なんでしょうねぇ。