「JavaScriptは言わばひとかたまりの大理石であり、私はその中からこの言語のすばらしい本質が現れるまで、美しくない機能を取り除いていく。最終的に私が削り出すことになる美しいサブセットは、より信頼でき、読みやすく、メンテナンスがしやすく、すべてにおいて非常に優れた言語になると私は信じている。」(「1章 良いパーツ」より)――本書は、JavaScript言語の「良いパーツ」に注目し、良質なコードを書くためのポイントを示唆する書籍です。「良いパーツ」を通してJavaScriptを再評価することで、見落とされていたJavaScript言語の本質が見えてきます。
JavaScript: The Good Parts
―「良いパーツ」によるベストプラクティス
Douglas Crockford 著、水野 貴明 訳
- TOPICS
- Programming , Web , JavaScript
- 発行年月日
- 2008年12月
- PRINT LENGTH
- 198
- ISBN
- 978-4-87311-391-3
- 原書
- JavaScript: The Good Parts
- FORMAT
- Print PDF
関連ファイル
正誤表
ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。
2009年1月(2刷にて修正)
- P.38 Math.ceiling(2箇所あり) ↓ Math.ceil - P.131 表B-1 ------------------------ & 論理積(and) | 論理和(or) ^ 排他的論理和(xor) ~ 否定(not) >> 符号付き右シフト >>> 符号なし右シフト << 左シフト ------------------------
2009年6月(3刷にて修正)
- 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' },
2010年3月(5刷にて修正)
- P.46 6行目 alert(e) ↓ alert(i)
2011年2月(7刷にて修正)
- 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]. (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]. ; } }; - 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]