開眼!JavaScriptを読みました

ソフトウェア開発

そろそろJavaScriptに開眼したほうが良いのではないかと思い、開眼!JavaScriptをという本を買いました。今のところ、Amazonのカスタマーレビューで全て★5つを獲得している、ニクイ本です。JavaScriptに開眼できたかどうかはさておき、上手い構成だし、読みやすい本でした。

なるほど、JavaScriptのキモをおさえるとは、つまり9つのネイティブ(もしくはビルトイン)オブジェクトコンストラクタをおさえることだったのか

JavaScriptはオブジェクト指向言語ですが、そのJavaScriptを支えているのは9つのネイティブ(もしくはビルトイン)オブジェクトコンストラクタです。つまり、この9つのコンストラクタをおさえることが、すなわちJavaScriptの真の理解に繋がるんだよね、というのが本書のキモです。

  • Number()
  • String()
  • Boolean()
  • Object()
  • Array()
  • Function()
  • Date()
  • RegExp()
  • Error()

とは言いつつ、Date()RegExp()Error()は端折られているし、体感的にほぼ8割ぐらいはObject()Function()の話なのですが、ゴールの持って行き方が大変良いなと思いました。「あ、この9つがキモなんだ」と、そのあたりかなり開眼できます。

どんな層向けの本なのかは悩ましいところだが・・・

初級者にはちょっと退屈な気がするし、中級者が読むべきかと言われれば大半知っている内容だし、そういう意味では誰が対象なのか、悩ましい本ではあります。

世の中に存在する、価値のあるJavaScriptの本は、ほとんどが3インチぐらいの厚さを持っています。David Flanaganによる『JavaScript第6版』(オライリー・ジャパン)は良書ですが、消化するには厚すぎます。徹底的にすべてを説明せずに核心に触れる本を書きたかったのです。(「はじめに」より抜粋)

JavaScriptで毎日コードを書いているものの、もやっとしたところを再度整理したいという人が、電車の中での読み物として読むのも良いと思います(僕のパターン)。スコープとクロージャの説明は、今まで読んだどの文章よりも分かりやすかったです。薄いけど内容のない本ではなく、薄いからこそ本当に内容のある本だと感じました。通勤のお供にどうぞー。

開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質
Cody Lindley
オライリージャパン
売り上げランキング: 21,304

目次

1章 JavaScriptオブジェクト
    1.1 オブジェクトの生成
    1.2 コンストラクタ関数はオブジェクトインスタンスを構築して返す
    1.3 ネイティブ/ビルトインオブジェクトのコンストラクタ
    1.4 ユーザ定義の(ネイティブではない)コンストラクタ関数
    1.5 new演算子とコンストラクタ関数でインスタンス生成
    1.6 リテラルを使って値を生成
    1.7 プリミティブ型(基本型)の値
    1.8 null、undefined、'string'、10、true、falseはオブジェクトではなくプリミティブ型
    1.9 プリミティブ値はどのように保存・複製されるか
    1.10 プリミティブ値は、値そのものを比較
    1.11 プリミティブ型の文字列、数値、真偽値はオブジェクトのように扱うとオブジェクトのように
        ふるまう
    1.12 オブジェクト(複合型の値)
    1.13 オブジェクトはどのように保存・複製されるか
    1.14 オブジェクトは同値判定に参照を使用
    1.15 オブジェクトは動的なプロパティを持つ
    1.16 typeof演算子の戻り値
    1.17 動的プロパティはミュータブル(可変)オブジェクトを可能にする
    1.18 すべてのコンストラクタのインスタンスはコンストラクタ関数にポイントする
        constructorプロパティを持つ
    1.19 instanceof演算子を使ってコンストラクタ関数を特定する
    1.20 インスタンスは自身のプロパティを持つことができる(インスタンスプロパティ)
    1.21 「JavaScriptオブジェクト」と「Object()オブジェクト」の意味

2章 オブジェクトとプロパティを扱う
    2.1 オブジェクトはすべての値をプロパティとして格納できる
    2.2 オブジェクトと配列でツリー構造や多次元配列を実現
    2.3 ドット記法とブラケット記法でオブジェクトのプロパティにアクセス
    2.4 delete演算子でプロパティを削除する
    2.5 プロパティへの参照はどのように解決されるのか
    2.6 hasOwnProperty()を使って、プロパティがプロトタイプチェーン経由ではないことを確認
    2.7 in演算子を使って、オブジェクトがプロパティを保持しているかどうかを確認する
    2.8 for-inループを使って、プロパティを列挙する
    2.9 ホストオブジェクト
    2.10 Underscore.jsを使ってオブジェクトを拡張する

3章 オブジェクト(Object())
    3.1 Object()オブジェクト
    3.2 Object()のパラメータ
    3.3 Object()が持つプロパティとメソッド
    3.4 Object()のインスタンスのプロパティとメソッド(String.prototypeのプロパティ)
    3.5 Object()オブジェクトをオブジェクトリテラルで生成する
    3.6 すべてのオブジェクトはObject.prototypeから継承する

4章 関数(Function())
    4.1 Function()オブジェクト
    4.2 Function()のパラメータ
    4.3 Function()が持つプロパティとメソッド
    4.4 Function()のインスタンスのプロパティとメソッド(Function.prototypeのプロパティ)
    4.5 関数は常に値を返す
    4.6 JavaScriptの関数は第一級関数
    4.7 関数に引数を渡す
    4.8 thisとargumentsはすべての関数本体で利用できる
    4.9 arguments.callee
    4.10 関数インスタンスのlengthプロパティとarguments.length
    4.11 引数を再定義
    4.12 関数の実行を中断
    4.13 関数の定義方法(宣言、式、もしくはコンストラクタ)
    4.14 関数の実行方法(関数、メソッド、コンストラクタ、もしくはcall()とapply())
    4.15 無名関数
    4.16 関数式を即時実行
    4.17 無名関数を即時実行
    4.18 関数は入れ子可能
    4.19 関数を関数に渡し、関数から関数を返す
    4.20 関数宣言を使って、定義される前に関数を実行する(関数の巻き上げ)
    4.21 関数は自身を呼ぶ事ができる(再帰)

5章 グローバルオブジェクト
    5.1 グローバルオブジェクト
    5.2 グローバル関数
    5.3 グローバルプロパティ、グローバル変数
    5.4 グローバルオブジェクトにアクセスする
    5.5 グローバルオブジェクトは暗黙的に参照される

6章 this
    6.1 thisとは何か、およびthisは何を参照するか
    6.2 thisの値はどのように決められるのか?
    6.3 入れ子関数内では、thisはグローバルオブジェクトを参照する
    6.4 入れ子関数内でthisを見失う問題をスコープチェーンを使って回避する
    6.5 call()やapply()を使ってthisの値をコントロールする
    6.6 thisキーワードをユーザ定義のコンストラクタ関数で使う
    6.7 プロトタイプメソッド内のthisは生成されるインスタンスを参照する

7章 スコープとクロージャ
    7.1 JavaScriptのスコープ
    7.2 JavaScriptはブロックスコープを持たない
    7.3 関数内で変数を定義する際は常にvarを使い、スコープの穴を避ける
    7.4 スコープチェーン(静的スコープ)
    7.5 スコープチェーンの検索は最初に発見した値を返す(マスキング)
    7.6 スコープは関数実行時ではなく関数定義時に決められる
    7.7 クロージャはスコープチェーンによって生成される
    7.8 グローバルスコープで宣言されている関数もクロージャである

8章 関数のprototypeプロパティ
    8.1 プロトタイプチェーン
    8.2 なぜprototypeプロパティが重要なのか
    8.3 prototypeプロパティはすべてのFunction()インスタンスに自動的に付与される
    8.4 prototypeプロパティのデフォルト値はObject()オブジェクト
    8.5 コンストラクタ関数から生成されたインスタンスはそのコンストラクタの
        prototypeプロパティにリンクする
    8.6 プロトタイプチェーンの終着点はObject.prototype
    8.7 プロトタイプチェーンは最初に見つけたプロパティを返す
    8.8 prototypeプロパティに新しいオブジェクトを設定するとデフォルトの
        constructorプロパティを失う
    8.9 プロトタイプからプロパティを継承するインスタンスは常に最新の値を取得
    8.10 prototypeプロパティを新しいオブジェクトに置き換えた場合、過去のインスタンスは
        更新しない
    8.11 ユーザ定義コンストラクタもプロトタイプ継承を行うことができる
    8.12 継承チェーンを生成する

9章 配列(Array())
    9.1 Array()オブジェクト
    9.2 Array() パラメータ
    9.3 Array()のプロパティとメソッド
    9.4 Array()のインスタンスのプロパティとメソッド(Array.prototypeのプロパティ)
    9.5 配列を生成する
    9.6 要素の追加・変更
    9.7 lengthとインデックス
    9.8 指定した数の要素を持った配列を生成する
    9.9 配列のlengthを設定して要素の追加・削除
    9.10 配列を配列に格納(多次元配列)
    9.11 配列の要素を前から・後ろからループする

10章 String()
    10.1 String()オブジェクト
    10.2 String()で文字列オブジェクトを生成、そして値を文字列に変換
    10.3 String()のプロパティとメソッド
    10.4 String()のインスタンスのプロパティとメソッド(String.prototypeのプロパティ)

11章 Number()
    11.1 Number()オブジェクト
    11.2 整数と小数
    11.3 Number()に引数を渡して数値に変換
    11.4 Number()のプロパティとメソッド
    11.5 Number()のインスタンスのプロパティとメソッド(Number.prototypeのプロパティ)

12章 Boolean()
    12.1 Boolean()オブジェクト
    12.2 Boolean()のパラメータ
    12.3 Boolean()のプロパティとメソッド
    12.4 Boolean()のインスタンスのプロパティとメソッド(Boolean.prototypeのプロパティ)
    12.5 真偽値オブジェクトは格納されている値がfalseであってもtrueと評価される
    12.6 いくつかの値はfalse、それ以外はすべてtrueに変換

13章 プリミティブ型文字列、数値、真偽値
    13.1 プリミティブ値は、プロパティにアクセスされるとオブジェクトに変換される
    13.2 文字列、数値、真偽値は常にプリミティブ型を使う

14章 null
    14.1 null
    14.2 typeof nullは'object'を返す

15章 undefined
    15.1 undefined
    15.2 JavaScript ECMA-262 Edition 3以降ではundefined変数が存在

16章 Math関数
    16.1 ビルトインMathオブジェクト
    16.2 Mathが持つプロパティとメソッド
    16.3 Mathはコンストラクタ関数ではない
    16.4 Mathオブジェクトは変更・削除不可