JavaScript: The Good Parts
――「良いパーツ」によるベストプラクティス

[cover photo]
  • 2008年12月 発行
  • 198ページ
  • ISBN978-4-87311-391-3
  • フォーマット Print PDF
  • 原書: JavaScript: The Good Parts

オライリー・ジャパンで書籍を購入:
定価1,944円

Ebook Storeで電子版を購入:
価格1,555円

「JavaScriptは言わばひとかたまりの大理石であり、私はその中からこの言語のすばらしい本質が現れるまで、美しくない機能を取り除いていく。最終的に私が削り出すことになる美しいサブセットは、より信頼でき、読みやすく、メンテナンスがしやすく、すべてにおいて非常に優れた言語になると私は信じている。」(「1章 良いパーツ」より)――本書は、JavaScript言語の「良いパーツ」に注目し、良質なコードを書くためのポイントを示唆する書籍です。「良いパーツ」を通してJavaScriptを再評価することで、見落とされていたJavaScript言語の本質が見えてきます。

関連書籍

JavaScript & DHTMLクックブック 第2版
Prototype & script.aculo.us
初めてのJavaScript 第3版

目次

訳者まえがき
はじめに

1章 良いパーツ
    1.1 なぜJavaScriptなのか?
    1.2 JavaScriptを解析する
    1.3 プログラムをテストする簡単な方法

2章 文法
    2.1 ホワイトスペース
    2.2 名前
    2.3 数値
    2.4 文字列
    2.5 命令文
    2.6 式
    2.7 リテラル
    2.8 関数

3章 オブジェクト
    3.1 オブジェクトリテラル
    3.2 値の取得
    3.3 値の更新
    3.4 参照
    3.5 プロトタイプ
    3.6 リフレクション
    3.7 プロパティの列挙
    3.8 プロパティの削除
    3.9 グローバル領域の利用を減らす

4章 関数
    4.1 Functionオブジェクト
    4.2 関数リテラル
    4.3 関数の呼び出し
    4.3.1 メソッド呼び出しパターン
    4.3.2 関数呼び出しパターン
    4.3.3 コンストラクタ呼び出しパターン
    4.3.4 apply呼び出しパターン
    4.4 引数
    4.5 戻り値
    4.6 例外
    4.7 変数型の拡張
    4.8 再帰
    4.9 スコープ
    4.10 クロージャ
    4.11 コールバック
    4.12 モジュール
    4.13 カスケード
    4.14 カリー化
    4.15 メモ化

5章 継承
    5.1 疑似クラス型
    5.2 オブジェクト指定子
    5.3 プロトタイプ型
    5.4 関数型
    5.5 オブジェクトのパーツ

6章 配列
    6.1 配列リテラル
    6.2 配列の長さ
    6.3 要素の削除
    6.4 要素の列挙
    6.5 配列かどうかの判定
    6.6 配列のメソッド
    6.7 次元

7章 正規表現
    7.1 正規表現の例
    7.2 正規表現の構築
    7.3 正規表現の構成要素
        7.3.1 選択肢
        7.3.2 正規表現シーケンス
        7.3.3 正規表現因子
        7.3.4 エスケープ
        7.3.5 正規表現グループ
        7.3.6 正規表現クラス
        7.3.7 正規表現クラスにおけるエスケープ
        7.3.8 数量詞

8章 メソッド
    Array
        array.concat( item... )
        array.join( separator )
        array.pop( )
        array.push( item... )
        array.reverse( )
        array.shift( )
        array.slice( start, end )
        array.sort( comparefn )
        array.splice( start, deleteCount, item... )
        array.unshift(item...)
    Function
        function.apply( thisArg, argArray )
    Number
        number.toExponential( fractionDigits )
        number.toFixed( fractionDigits )
        number.toPrecision( precision )
        number.toString( radix )
    Object
        object.hasOwnProperty( name )
    RegExp
        regexp.exec( string )
        regexp.test( string )
    String
        string.charAt( pos )
        string.charCodeAt( pos )
        string.concat( string... )
        string.indexOf( searchString, position )
        string.lastIndexOf( searchString, position )
        string.localeCompare( that )
        string.match( regexp )
        string.replace( searchValue, replaceValue )
        string.search( regexp )
        string.slice( start, end )
        string.split( separator, limit )
        string.substring( start, end )
        string.toLocaleLowerCase( )
        string.toLocaleUpperCase( )
        string.toLowerCase( )
        string.toUpperCase( )
        String.fromCharCode( char... )

9章 スタイル

10章 美しい機能たち

付録A ひどいパーツ
    A.1 グローバル変数
    A.2 スコープ
    A.3 セミコロン挿入
    A.4 予約語
    A.5 ユニコード
    A.6 typeof
    A.7 parseInt
    A.8 +
    A.9 浮動小数
    A.10 NaN
    A.11 偽の配列
    A.12 Falsyな値
    A.13 hasOwnProperty
    A.14 オブジェクト

付録B 悪いパーツ
    B.1 ==
    B.2 with文
    B.3 eval
    B.4 continue文
    B.5 switch 文での処理の継続
    B.6 ブロックなしの文
    B.7 ++ --
    B.8. ビット演算子
    B.9 function文とfunction式の比較
    B.10 変数型のラッパーオブジェクト
    B.11 new
    B.12 void

付録C JSLint
    C.1 定義されていない変数と関数
    C.2 メンバ名
    C.3 オプション
    C.4 セミコロン
    C.5 改行
    C.6 コンマ
    C.7 ブロックの利用の強制
    C.8 許可されないブロック
    C.9 式文
    C.10 for in 文
    C.11 switch文
    C.12 var文
    C.13 with文
    C.14 =
    C.15 == と !=
    C.16 ラベル
    C.17 実行されないコード
    C.18 混乱を招く正負記号
    C.19 ++ と --
    C.20 ビット演算子
    C.21 evalは邪悪である
    C.22 void
    C.23 正規表現
    C.24 コンストラクタとnew
    C.25 JSLintがしないこと
    C.26 HTML
    C.27 JSON
    C.28 レポート

付録D 鉄道ダイアグラム

付録E JSON
    E.1 JSONの文法
    E.2 安全にJSONを利用する
    E.3 JSONパーサ

索引

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

- P.38
  Math.ceiling(2箇所あり)
  ↓
  Math.ceil

- P.131 表B-1
  ------------------------
  &    論理積(and)
  |    論理和(or)
  ^    排他的論理和(xor)
  ~    否定(not)
  >>   符号付き右シフト
  >>>  符号なし右シフト
  <<   左シフト
  ------------------------

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

- P.10
  10を乗じた数
  ↓
  10を累乗した数

- P.13 図2-10 と P.155の図
  文の順番を以下ように並べ(上から下へ)て修正。
  式文
  順序破壊文
  try文
  if文
  switch文
  while文
  for文
  do文

- P.18 表2-1
  べき乗計算
  ↓
  剰余

- P.24
  stooge["first-name"]     // "Joe"
  ↓
  stooge["first-name"]     // "Jerome"

- P.34
  document.writeln(myObject.getValue()); // 6
  ↓
  document.writeln(myObject.value);

- P.39
  Function.prototype.method = function (name, func) {
      if (!this.prototype[name]) {
          this.prototype[name] = func;
      }
  };
  ↓
  Function.prototype.method = function (name, func) {
      if (!this.prototype[name]) {
          this.prototype[name] = func;
          return this;
     }
  };

- P.57
  last: l,
  state: s,
  ↓
  last: l,
  middle: m,
  state: s,

- P.62の2つめのコード
  that.get_name = function () {
      return that.says() + ' ' + spec.name + ' ' + that.says();
  return that;
  ↓
  that.get_name = function () {
      return that.says() + ' ' + spec.name + ' ' + that.says();
  };
  return that;

- P.82
  new RegExp("\"(?:\\.|[^\\\\\\\"])*\"", 'g'))
  ↓
  new RegExp("\"(?:\\\\.|[^\\\\\\\"])*\"", 'g'))

- P.82
  なお正規表現リテラルで生成されたRegExpオブジェクトは
  ↓
  なお同じ正規表現リテラルで生成されたRegExpオブジェクトは

- P.85
  var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD'\-]+)\s+\1/gi;
  ↓
  var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+\1/gi;

- P.104
  // p is '555-555-1212'
  ↓
  // p is '555-666-1212'

- P.122
  JavaScriptはisNan関数を
  ↓
  JavaScriptはisNaN関数を

- P.137 表C-1
  glovarの行を削除

- P.157 シェークスピアの引用文中
  shoulddwell
  ↓
  should dwell

- P.162
           escapee = {
               '"':  '"'
               '\\': '\\',
               '/':  '/',
               b:    'b',
               f:    '\f',
               n:    '\n',
               r:    '\r'
               t:    '\t'
           },
  ↓
           escapee = {
               '"':  '"',
               '\\': '\\',
               '/':  '/',
               b:    'b',
               f:    '\f',
               n:    '\n',
               r:    '\r',
               t:    '\t'
           },

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

- P.46 6行目
  alert(e)
  ↓
  alert(i)

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

- 16P 図2-19と148Pの最後のダイアグラム
finally節を追加

- 24P 値の取得
誤:
もし文字列式が定数で
正:
もし文字列式が文字列リテラルで

- 37P 最後のコード
誤:
try-it();
正:
try_it();

- 43P サンプルコード
誤:
var myObject = function ( ) {
    var value = 0;
    return {
        increment: function (inc) {
            value += typeof inc === ' number' ? inc : 1;
        },
        getValue: function ( ) {
            return value;
        }
    };
}( );
正:
var myObject = (function ( ) {
    var value = 0;
    return {
        increment: function (inc) {
            value += typeof inc === ' number' ? inc : 1;
        },
        getValue: function ( ) {
            return value;
        }
    };
}( ));

- 46P 先頭のコード(よりよい例)
誤:
var add_the_handlers = function (nodes) {

    var i;
    for (i = 0; i < nodes. length; i += 1) {
        nodes[i].onclick = function (i) {
            return function (e) {
                alert(i) ;
            };
        }(i);
    }
};
正:
var add_the_handlers = function (nodes) {
    var helper = function (i) {
        return function (e) {
            alert(i) ;
        };
    };
    var i;
    for (i = 0; i < nodes. length; i += 1) {
        nodes[i].onclick = helper(i) ;
    }
};

- 49P カスケード コード
※.を前に書くスタイルに変更

正
getElement('myBoxDiv')
    .move(350, 150)
    .width(100)
    .height(100)
    .color('red' )
    .border('10px outset' )
    .padding('4px' )
    .appendText("Please stand by")
    .on('mousedown' , function (m) {
        this.startDrag(m, this. getNinth(m));
    })
    .on('mousemove', 'drag' )
    .on('mouseup', 'stopDrag' )
    .later(2000, function () {
        this
            .color('yellow' )
            .setHTML("What hath God wraught?")
            .slide(400, 40, 200, 200);
    })
    tip(' This box is resizeable' );

-56P 一番下のコード
※1行にする
誤:
    method('get_name', function () {
        return this.says( ) + ' ' + this.name + 
            ' ' + this. ays( );
    });
正:
    method('get_name', function () {
        return this.says( ) + ' ' + this.name + ' ' + this. ays( );
    });

-64P 
※必須ではありませんが、こうすることで最後の行の
コメントが見やすくなる(コメントが64Pに収まる)。
旧:
type = typeof event === 'string' ? 
                             event : event.type;
新:
type = typeof event === 'string' ? event : event.type;

- 95P-96P
(※コード抜粋)

誤:
    else if (delta > 0) {
        k = 1;
        while (shift_count) {
            this[new_len - k] = this[len - k] ;
            k += 1;
            shift_count -= 1;
        }
    }
正:
    else if (delta > 0) {
        k = 1;
        while (shift_count) {
            this[new_len - k] = this[len - k] ;
            k += 1;
            shift_count -= 1;
        }
        this.length = new_len;
    }

- 99P 一番下のコメント行
誤:
// [1] タグ名
// [2] もしあれば「/」
正:
// [1] もしあれば「/」
// [2] タグ名

- 101P
※コメントが(原著において)途中から抜け落ちていたようです
誤:
   :
   :
// [2] p
// [3]

正:
   :
   :
// [2] p
// [3]
// [0] 
// [1] /
// [2] body
// [3]
// [0] 
// [1] /
// [2] html
// [3]

- 105P 最後のコード
誤:
// a is ['0', '1', '2', '3', '456789']
正:
// a is ['0', '1', '2', '3', '4']

- 117P 冒頭部分
誤:
本章では
正:
本付録では

-122P A.11
※一番下のコードとそれに続く文章を置き換え
正:
if (Object.prototype.toString.apply(my_value) === '[object Array]') {
    // my_valueは本当に配列だ!
}

argumentsはlengthというメンバを持ったオブジェクトだが配列ではない。
上記のテストはすべて、argumentsを配列と識別してしまうことはない。

- 132P B9
誤:
文の先頭にfunction式を書くには、function式を括弧でくるめばいい。
正:
文の先頭にfunction式を書くには、全体を括弧でくるめばいい。

- 132P B9
※コードの最後
誤:
})();
正:
}());

-138-139P C5
※ピリオドを2番目の一覧へ
誤:
, . ; : { } ( [ = < > ? ! + - * / % ~ ^ | &
== ! = <= >= += -= *= /= %= ^= | = &= << >> | | &&
=== ! == <<= >>= >>> >>>=
と
) ] ++ --

正:
, ; : { } ( [ = < > ? ! + - * / % ~ ^ | &
== ! = <= >= += -= *= /= %= ^= | = &= << >> | | &&
=== ! == <<= >>= >>> >>>=
と
) ] . ++ --

- 148P
try文とwhile文のタイトルを入替え

- 161P 最後
誤:
JavaScriptが何か他のもので置き換えられるまで存在し
続ける。注意せよ。
正:
JavaScriptが修正されるか、何か他のもので置き換えら
れるまで存在し続ける。注意せよ。

- 171P 索引
誤:
Object.createメソッド ... 58,73

正:
Object.createメソッド ... 26, 58,73

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

- 49P 最後の行:
誤:
tip('This box is resizeable.');
正:
tip("This box is resizeable.");

- 138P 図C-2
誤:
/*members
正:
/*properties

- 21P 図2-30 と 149P
誤:
文字列
正:
文字列リテラル

Feedback

皆さんのご意見をお聞かせください。ご購入いただいた書籍やオライリー・ジャパンへのご感想やご意見、ご提案などをお聞かせください。より良い書籍づくりやサービス改良のための参考にさせていただきます。
[feedbackページへ]