目次
- Speaking JavaScriptへの賛辞
- まえがき
- 本書について知っておくべきこと
- 本書を読むためのヒント
- 本書の4つのパート
- JavaScriptコマンドライン
- 表記上の規則
- 構文の説明
- メソッドの参照
- コマンドラインのインタラクション
- ヒント、メモ、警告
- ドキュメントをすばやく見つける
- Safari® Books Online
- お問い合わせ方法
- 謝辞
- JavaScriptの準備
- JavaScriptに関するヘルプ
- レビューア
- I. JavaScriptクイックスタート
- 1. JavaScriptの基本
- 背景
- JavaScriptとECMAScriptの違い
- 言語の影響と性質
- 構文
- 構文の概要
- ステートメントと式の違い
- セミコロン
- コメント
- 変数と代入
- 代入
- 複合代入演算子
- 識別子と変数名
- 値
- プリミティブ値とオブジェクト
- プリミティブ値
- オブジェクト
- undefinedとnull
- typeofとinstanceofを使用した値の分類
- ブール値
- TruthyとFalsy
- 二項論理演算子
- 等価演算子
- 数値
- 演算子
- 文字列
- 文字列演算子
- 文字列メソッド
- ステートメント
- 条件分岐
- ループ
- 関数
- 関数宣言は巻き上げられる
- 特殊変数arguments
- 引数が多すぎる場合、または少なすぎる場合
- オプションのパラメータ
- アリティの強制
- argumentsを配列に変換する
- 例外処理
- 厳格モード
- 変数のスコープとクロージャ
- 変数は関数スコープである
- 変数は巻き上げられる
- クロージャ
- IIFEパターン:新しいスコープの導入
- オブジェクトとコンストラクタ
- 単一のオブジェクト
- 任意のプロパティキー
- メソッドの抽出
- メソッド内の関数
- コンストラクタ:オブジェクトのファクトリ
- 配列
- 配列リテラル
- 配列メソッド
- 配列の反復処理
- 正規表現
- メソッドtest():一致するものがあるか?
- メソッドexec():一致とキャプチャグループ
- メソッドreplace():検索と置換
- Math
- 標準ライブラリのその他の機能
- II. 背景
- 2. なぜJavaScriptなのか?
- JavaScriptは無料で利用できますか?
- JavaScriptはエレガントですか?
- JavaScriptは役に立ちますか?
- グラフィカルユーザーインターフェース
- JavaScriptを補完するその他のテクノロジー
- JavaScriptは優れたツールを持っていますか?
- JavaScriptは十分に高速ですか?
- JavaScriptは広く使用されていますか?
- JavaScriptには未来がありますか?
- 結論
- 3. JavaScriptの性質
- 癖と非正統的な機能
- エレガントな部分
- 影響
- 4. JavaScriptがどのように作成されたか
- 5. 標準化:ECMAScript
- 6. JavaScriptの歴史的なマイルストーン
- III. JavaScriptの詳細
- 7. JavaScriptの構文
- 構文の概要
- コメント
- 式とステートメントの違い
- 式
- ステートメント
- 制御フローのステートメントとブロック
- セミコロンを使用するためのルール
- ブロックで終わるステートメントの後にはセミコロンを付けない
- 空のステートメント
- 自動セミコロン挿入
- 有効な識別子
- 数値リテラルでのメソッドの呼び出し
- 厳格モード
- 厳格モードへの切り替え
- 厳格モード:推奨、ただし注意が必要
- 変数は厳格モードで宣言する必要がある
- 厳格モードでの関数
- 厳格モードでは、不変プロパティの設定と削除が例外で失敗する
- 厳格モードでは、非修飾識別子を削除できない
- eval()は厳格モードでよりクリーンになる
- 厳格モードで禁止されている機能
- 8. 値
- JavaScriptの型システム
- JavaScriptの型
- 静的と動的
- 静的型付けと動的型付け
- 静的型チェックと動的型チェック
- 強制型変換
- プリミティブ値とオブジェクト
- プリミティブ値
- オブジェクト
- undefinedとnull
- undefinedとnullの出現
- undefinedまたはnullのチェック
- undefinedとnullの歴史
- undefinedの変更
- プリミティブのラッパーオブジェクト
- ラッパーオブジェクトはプリミティブとは異なる
- プリミティブのラップとアンラップ
- プリミティブはラッパーからメソッドを借りる
- 型強制変換
- 型強制変換はバグを隠す可能性がある
- ブール値、数値、文字列、オブジェクトに変換するための関数
- アルゴリズム:ToPrimitive()—値をプリミティブに変換する
- 9. 演算子
- 演算子とオブジェクト
- 代入演算子
- 複合代入演算子
- 等価演算子:===と==の違い
- 厳密な等価性(===, !==)
- 通常(寛容な)等価性(==, !=)
- ==の有効なユースケースはない
- 順序付け演算子
- アルゴリズム
- プラス演算子(+)
- アルゴリズム
- ブール値と数値の演算子
- 特殊な演算子
- 条件演算子(?:)
- コンマ演算子
- void演算子
- typeofとinstanceofによる値の分類
- typeof:プリミティブの分類
- instanceof:オブジェクトが指定されたコンストラクタのインスタンスであるかどうかを確認する
- オブジェクト演算子
- 10. ブール値
- ブール値への変換
- ブール値への手動変換
- Truthy値とFalsy値
- 論理演算子
- 二項論理演算子:And (&&) と Or (||)
- 論理And(&&)
- 論理Or(||)
- 論理Not(!)
- 等価演算子、順序付け演算子
- 関数Boolean
- 11. 数値
- 数値リテラル
- 指数
- リテラルでのメソッドの呼び出し
- 数値への変換
- 数値への手動変換
- parseFloat()
- 特別な数値
- NaN
- Infinity
- 2つのゼロ
- 数値の内部表現
- 特別な指数
- 丸め誤差の処理
- JavaScriptの整数
- 整数の範囲
- 浮動小数点数としての整数の表現
- 安全な整数
- 整数への変換
- Math.floor(), Math.ceil(), および Math.round() を使用した整数
- カスタム関数ToInteger()による整数
- ビット単位演算子による32ビット整数
- parseInt()による整数
- 算術演算子
- ビット単位演算子
- 背景知識
- ビット単位Not演算子
- 二項ビット単位演算子
- ビット単位シフト演算子
- 関数Number
- Numberコンストラクタプロパティ
- Numberプロトタイプメソッド
- Number.prototype.toFixed(fractionDigits?)
- Number.prototype.toPrecision(precision?)
- Number.prototype.toString(radix?)
- Number.prototype.toExponential(fractionDigits?)
- 数値の関数
- この章の出典
- 12. 文字列
- 文字列リテラル
- 文字列リテラルでのエスケープ
- 文字アクセス
- 文字列への変換
- 文字列への手動変換
- 文字列の比較
- 文字列の連結
- 連結:プラス(+)演算子
- 連結:文字列フラグメントの配列の結合
- 関数String
- Stringコンストラクタメソッド
- Stringインスタンスプロパティlength
- Stringプロトタイプメソッド
- 部分文字列の抽出
- 変換
- 検索と比較
- 正規表現を使用したテスト、一致、および置換
- 13. ステートメント
- 変数の宣言と代入
- ループと条件分岐の本体
- ループ
- ループで使用するメカニズム
- while
- do-while
- for
- for-in
- for each-in
- 条件分岐
- if-then-else
- switch
- withステートメント
- 構文とセマンティクス
- withステートメントは推奨されません
- 非推奨の理由
- debuggerステートメント
- 14. 例外処理
- 例外処理とは
- JavaScriptの例外処理
- throw
- try-catch-finally
- 例
- Errorコンストラクタ
- スタックトレース
- 独自のエラーコンストラクタの実装
- 15. 関数
- JavaScriptにおける関数の3つの役割
- 用語:「パラメータ」と「引数」
- 関数の定義
- 関数式
- 関数宣言
- Functionコンストラクタ
- 巻き上げ
- 関数の名前
- 関数宣言と関数式のどちらが良いか?
- 関数呼び出しのより詳細な制御:call(), apply(), および bind()
- func.apply(thisValue, argArray)
- func.bind(thisValue, arg1, ..., argN)
- 不足または余分なパラメータの処理
- インデックスによるすべてのパラメータ:特殊変数arguments
- 必須パラメータ、最小アリティの強制
- オプションのパラメータ
- 参照渡しパラメータのシミュレーション
- 落とし穴:予期しないオプションのパラメータ
- 名前付きパラメータ
- 名前付きパラメータを説明として使用する
- オプションの名前付きパラメータ
- JavaScriptでの名前付きパラメータのシミュレーション
- 16. 変数:スコープ、環境、およびクロージャ
- 変数の宣言
- 背景:静的と動的
- 背景:変数のスコープ
- 変数は関数スコープである
- 変数宣言は巻き上げられる
- IIFEによる新しいスコープの導入
- IIFEのバリエーション:接頭辞演算子
- IIFEのバリエーション:既に式コンテキスト内
- IIFEのバリエーション:パラメータ付きのIIFE
- IIFEのアプリケーション
- グローバル変数
- ベストプラクティス:グローバル変数の作成は避ける
- モジュールシステムはグローバル変数の数を減らす
- グローバルオブジェクト
- クロスプラットフォームの考慮事項
- windowのユースケース
- 環境:変数の管理
- クロージャ:関数は生成されたスコープに接続されたままになる
- 環境によるクロージャの処理
- 落とし穴:誤って環境を共有してしまう
- 17. オブジェクトと継承
- レイヤー1:単一のオブジェクト
- プロパティの種類
- オブジェクトリテラル
- ドット演算子(.):固定キーを介したプロパティへのアクセス
- 通常ではないプロパティキー
- ブラケット演算子([]):計算されたキーを介したプロパティへのアクセス
- 任意の値のオブジェクトへの変換
- 関数とメソッドの暗黙的なパラメータとしてのthis
- thisの設定中の関数の呼び出し:call(), apply(), および bind()
- コンストラクタのためのapply()
- 落とし穴:メソッドの抽出時にthisを失う
- 落とし穴:メソッド内の関数がthisを隠蔽する
- レイヤー2:オブジェクト間のプロトタイプ関係
- 継承
- オーバーライド
- プロトタイプを介したオブジェクト間のデータの共有
- プロトタイプの取得と設定
- 特殊プロパティ __proto__
- 設定と削除は自身のプロパティにのみ影響する
- プロパティの反復処理と検出
- 自身のプロパティキーの一覧表示
- すべてのプロパティキーの一覧表示
- プロパティが存在するかどうかの確認
- 例
- ベストプラクティス: 自身のプロパティの反復処理
- アクセサ (ゲッターとセッター)
- オブジェクトリテラルによるアクセサの定義
- プロパティ記述子によるアクセサの定義
- アクセサと継承
- プロパティ属性とプロパティ記述子
- プロパティ属性
- プロパティ記述子
- 記述子によるプロパティの取得と定義
- オブジェクトのコピー
- プロパティ: 定義と代入
- 継承された読み取り専用プロパティには代入できない
- 列挙可能性: ベストプラクティス
- オブジェクトの保護
- 拡張の防止
- シーリング
- フリーズ
- 落とし穴: 保護は浅い
- レイヤー 3: コンストラクタ—インスタンスのファクトリー
- JavaScript で実装された new 演算子
- 用語: 2 つのプロトタイプ
- インスタンスの constructor プロパティ
- instanceof 演算子
- コンストラクタを実装するためのヒント
- プロトタイププロパティ内のデータ
- インスタンスプロパティの初期値を持つプロトタイププロパティを避ける
- 非多態的なプロトタイププロパティを避ける
- 多態的なプロトタイププロパティ
- データをプライベートに保つ
- コンストラクタの環境におけるプライベートデータ (Crockford プライバシーパターン)
- マークされたキーを持つプロパティ内のプライベートデータ
- 具象化されたキーを持つプロパティ内のプライベートデータ
- IIFE を介してグローバルデータをプライベートに保つ
- レイヤー 4: コンストラクタ間の継承
- インスタンスプロパティの継承
- プロトタイププロパティの継承
- instanceof が動作することを保証する
- メソッドのオーバーライド
- スーパーコールの実行
- スーパークラスのハードコードされた名前を避ける
- 例: コンストラクタ継承の使用
- 例: ビルトインコンストラクタの継承階層
- アンチパターン: プロトタイプがスーパークラスのインスタンスである
- すべてのオブジェクトのメソッド
- プリミティブへの変換
- Object.prototype.toLocaleString()
- プロトタイプ継承とプロパティ
- 汎用メソッド: プロトタイプからのメソッドの借用
- リテラルを介した Object.prototype および Array.prototype へのアクセス
- 汎用的なメソッド呼び出しの例
- 配列風オブジェクトと汎用メソッド
- すべての汎用メソッドのリスト
- 落とし穴: オブジェクトをマップとして使用する
- 落とし穴 1: 継承がプロパティの読み取りに影響を与える
- 落とし穴 2: オーバーライドがメソッドの呼び出しに影響を与える
- 落とし穴 3: 特殊プロパティ __proto__
- dict パターン: プロトタイプを持たないオブジェクトはより良いマップである
- ベストプラクティス
- チートシート: オブジェクトの操作
- 18. 配列
- 概要
- 配列はマップであり、タプルではない
- 配列はプロパティを持つこともできる
- 配列の作成
- Array コンストラクタ
- 多次元配列
- 配列のインデックス
- in 演算子とインデックス
- 配列要素の削除
- 配列インデックスの詳細
- length
- 配列の長さを手動で増やす
- 配列の長さを減らす
- 最大長
- 配列の穴
- 穴の作成
- スパース配列と密な配列
- どの操作が穴を無視し、どの操作が穴を考慮するか?
- 配列から穴を削除する
- Array コンストラクタメソッド
- Array プロトタイプメソッド
- 要素の追加と削除 (破壊的)
- 要素のソートと反転 (破壊的)
- 数値の比較
- 文字列の比較
- オブジェクトの比較
- 連結、スライス、結合 (非破壊的)
- 値の検索 (非破壊的)
- 反復処理 (非破壊的)
- 検査メソッド
- 変換メソッド
- 削減メソッド
- 落とし穴: 配列風オブジェクト
- ベストプラクティス: 配列の反復処理
- 19. 正規表現
- 正規表現の構文
- アトム: 一般
- アトム: 文字クラス
- アトム: グループ
- 量指定子
- アサーション
- 分離
- Unicode と正規表現
- 正規表現の作成
- リテラル対コンストラクタ
- フラグ
- 正規表現のインスタンスプロパティ
- 正規表現を作成する例
- RegExp.prototype.test: 一致するものがあるか?
- String.prototype.search: どのインデックスに一致するものがあるか?
- RegExp.prototype.exec: キャプチャグループ
- 最初の一致 (フラグ /g が設定されていない)
- すべての一致 (フラグ /g が設定されている)
- String.prototype.match: キャプチャグループまたは一致するすべての部分文字列を返す
- String.prototype.replace: 検索と置換
- 置換は文字列である
- 置換は関数である
- フラグ /g の問題
- ヒントとコツ
- テキストの引用
- 落とし穴: アサーション (^, $ など) がないと、正規表現はどこでも見つかる
- すべてに一致または何も一致しない
- 後読みを手動で実装する
- 正規表現チートシート
- 20. 日付
- Date コンストラクタ
- Date コンストラクタメソッド
- Date プロトタイプメソッド
- 時間単位のゲッターとセッター
- さまざまなゲッターとセッター
- 日付を文字列に変換する
- 日付時刻形式
- 日付形式 (時間なし)
- 時間形式 (日付なし)
- 日付時刻形式
- タイム値: 1970-01-01 からのミリ秒単位の日付
- 日付を数値に変換する
- 21. Math
- Math プロパティ
- 数値関数
- 三角関数
- その他の関数
- 22. JSON
- 背景
- データ形式
- 履歴
- 文法
- JSON.stringify(value, replacer?, space?)
- JSON.stringify() で無視されるデータ
- toJSON() メソッド
- JSON.parse(text, reviver?)
- ノードビジターによるデータの変換
- JSON.stringify()
- JSON.parse()
- 23. 標準グローバル変数
- コンストラクタ
- Errorコンストラクタ
- 非コンストラクタ関数
- テキストのエンコードとデコード
- 数値の分類と解析
- eval() と new Function() による JavaScript コードの動的な評価
- eval() を使用したコードの評価
- new Function() を使用したコードの評価
- eval() 対 new Function()
- ベストプラクティス
- 結論
- コンソール API
- エンジン間でコンソール API はどれくらい標準化されているか?
- 単純なログ
- チェックとカウント
- 書式付きログ
- プロファイリングとタイミング
- 名前空間と特殊な値
- 24. Unicode と JavaScript
- Unicode の歴史
- 重要な Unicode の概念
- コードポイント
- Unicode エンコーディング
- JavaScript ソースコードと Unicode
- 内部のソースコード
- 外部のソースコード
- JavaScript 文字列と Unicode
- エスケープシーケンス
- エスケープを介したアストラル面文字の参照
- 文字のカウント
- Unicode 正規化
- JavaScript 正規表現と Unicode
- 任意のコードユニットと任意のコードポイントとのマッチング
- ライブラリ
- 参考文献と章の出典
- 25. ECMAScript 5 の新機能
- 新機能
- 構文の変更
- 標準ライブラリの新しい機能
- メタプログラミング
- 新しいメソッド
- JSON
- レガシーブラウザを操作するためのヒント
- IV. ヒント、ツール、ライブラリ
- 26. メタコードスタイルガイド
- 既存のスタイルガイド
- 一般的なヒント
- コードは一貫性があるべき
- コードは理解しやすいべき
- 一般的に受け入れられているベストプラクティス
- ブレーススタイル
- コンストラクタよりもリテラルを優先する
- 賢くなりすぎない
- 許容される賢さ
- 議論の余地のあるルール
- 構文
- 変数
- オブジェクト指向
- その他
- 結論
- 27. デバッグのための言語メカニズム
- 28. ビルトインのサブクラス化
- 用語
- 障害 1: 内部プロパティを持つインスタンス
- 障害 1 の回避策
- 注意点
- 障害 2: 関数として呼び出すことができないコンストラクタ
- 障害 2 の回避策
- 別の解決策: 委譲
- 29. JSDoc: API ドキュメントの生成
- JSDoc の基本
- 構文
- 型の命名
- 基本タグ
- 関数とメソッドのドキュメント化
- インライン型情報 (“インラインドキュメントコメント”)
- 変数、パラメータ、インスタンスプロパティのドキュメント化
- クラスのドキュメント化
- コンストラクタ関数によるクラスの定義
- オブジェクトリテラルによるクラスの定義
- @constructs メソッドを持つオブジェクトリテラルによるクラスの定義
- サブクラス化
- その他の便利なタグ
- 30. ライブラリ
- シム対ポリフィル
- 4 つの言語ライブラリ
- ECMAScript 国際化 API
- ECMAScript 国際化 API, 第 1 版
- どのような標準か?
- いつ使用できるか?
- さらに読む
- JavaScript リソースのディレクトリ
- 31. モジュールシステムとパッケージマネージャー
- モジュールシステム
- パッケージマネージャー
- 簡単で簡潔なモジュール
- 32. その他のツール
- 33. 次に何をすべきか
- 索引
- 著者について
- 奥付
- 著作権