ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[正誤表] JavaScript 第5版 初版第9刷 正誤表

 
前書きにある通り、サンプルコードは原著のサイトからダウンロードできます。
次のURLを開き、右側のメニューにある Download Example Code を辿ってみてください。
http://www.oreilly.com/catalog/jscript5/

上のリンクからも辿れますが、以下のリンク先に原著の正誤情報が掲載されています。
本記事に示す正誤表のいくつかの項目は、このリンク先が情報源になっています。
なお、原著の正誤情報は数が多いので、すべて拾いきれてません。

Confirmed Errata
http://oreilly.com/catalog/errata.csp?isbn=9780596101992

Unconfirmed Errata
http://oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596101992



以下、「JavaScript 第5版 初版第9刷」で見つかった誤記です。
一部、補足めいたものもあります。

p.113
var undefs = [,,];   // 2個の要素を持つ配列。両要素とも未定義。
→ Firefox は2個だが、Internet Explorer は3個の要素が出来る。

p.119
2番目の引数を省略すると、指定された開始位置から配列の最後までの要素がすべて削除されます。

→ 2番目の引数を省略すると、Firefox では本文にあるとおり、
指定した位置以降のすべての要素を削除するが、
Internet Explorer 9 や Opera では、何も削除しない。

p.136
(誤)  if (window.screenLeft) { // IE など

(正) if (window.screenLeft !== undefined) { // IE など
Geometry.getWindowX = function() { return window.screenLeft; };
Geometry.getWindowY = function() { return window.screenTop; };
}
(誤) else if (window.screenX) { // Firefox など
(正) else if (window.screenX !== undefined) { // Firefox など
Geometry.getWindowX = function() { return window.screenX; };
Geometry.getWindowY = function() { return window.screenY; };
}
※ IE も Firefox もフルスクリーン・モード(F11押下)で Geometry オブジェクトを初期化すると、
  window.screenLeft も window.screenX も 0 になり、if条件を満たせなくなってしまうため。

p.139
function copyUndefinedProperties(/* オブジェクト */ from, /* オブジェクト */ to) {

for(p in from) {
(誤) if (!p in to) to[p] = from[p];
(正) if (!(p in to)) to[p] = from[p];
}
※ !演算子は、in 演算子よりも優先度が高いので、括弧が必要。
 元のコードでは プロパティ名 p に対して !p は常に falseに評価され、
 "false" という名前のプロパティを to オブジェクトが持たない場合、
 条件判定は常にfalseとなり、持つ場合は常にtrueとなる。

p.152
しかし、コンストラクタから別のオブジェクトを返すことは可能です。
そうすると、返されたオブジェクトがnew式の値になります。
この場合、thisの値であったオブジェクトは破棄されます。

return {a:1, b:2} のようにオブジェクトを返す場合の話。
 基本データ型の値をリターンする場合は、そのリターン値は捨てられる。

p.168
complexNumbers.sort(new function(a,b) { return a.compareTo(b); });
complexNumbers.sort(function(a,b) { return a.compareTo(b); });

p.171
例9-3 JavaScript クラスのサブクラス化の例(続き)
(誤)
// プロトタイプオブジェクトは、Rectangle()コンストラクタと一緒に生成され
// るので、

(正)
// プロトタイプオブジェクトは、Rectangle()コンストラクタによって生成され
// るので、

※ Since the prototype object was created with the Rectangle( ) constructor,
の「with」を「一緒に」と訳してしまうと意味が通じなくなる。

p.184
(誤)
for(var i = 0; i < borrows.length; i++) {

var c = data.borrows[i];
borrows[i] = c;
(正)
for(var i = 0; i < borrows.length; i++) {

var c = borrows[i];
※ defineClass 関数仕様には、引数オブジェクトの borrows プロパティには、
 「コンストラクタ関数、または、コンストラクタ関数の配列」が指摘できると書かれているが、
 修正前のコードでは、関数単体を指定することができない。
 例えば
    var PositionedRectangle = defineClass({

name: "PositionedRectangle",
...
borrows: [GenericEquals]
});
 は動作するが、
    var PositionedRectangle = defineClass({

name: "PositionedRectangle",
...
borrows: GenericEquals // 配列ではなく関数単体を指定した場合エラー。
});
 は動作しない。
 providesプロパティの指定方法も同様の仕様であり、そちらは問題なく動作したので、
 訂正後のコードは、provides の処理方法に合わせた。

p.227
(誤) java.math.BigDoubleまで含まれます。
(正) java.math.BigDecimalまで含まれます。

p.229
Swing GUIの起動方法が誤っている。
    public class Keys {


public static void main(String[] args) throws ScriptException, IOException
{
// スクリプトを実行するために「ScriptEngine」を取得する。
ScriptEngineManager scriptManager = new ScriptEngineManager();
ScriptEngine js = scriptManager.getEngineByExtension("js");

// スクリプトを実行する。実行結果は捨てる。ここで興味があるのは、
// スクリプト中で関数を定義することだから。
js.eval(new FileReader("listener.js"));

// Invocableにキャストして、KeyListenerを実装するオブジェクトを取得する。
Invocable invocable = (Invocable) js;
(修正) final KeyListener listener = invocable.getInterface(KeyListener.class);

// このKeyListenerをGUIで使用する。
(追加) SwingUtilities.invokeLater(new Runnable() {
(追加) public void run() {
JFrame frame = new JFrame("Keys Demo");
frame.addKeyListener(listener);
frame.setSize(200, 200);
frame.setVisible(true);
(追加) }
(追加) });
}
}
Swingの起動方法については以下の記事が参考になる。特に Java Tutorials の次の記述に注意。
Why does not the initial thread simply create the GUI itself? Because almost all code that creates or interacts with Swing components must run on the event dispatch thread.
なぜ、最初のスレッドが単純にGUI自体を作成しないのか、それは、Swingコンポーネントを作成するか、相互作用するほぼすべてのコードは、イベントディスパッチスレッド上で実行する必要があるためです。


Q4.3 SwingのGUIを起動する正しいやり方は?
http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html#four3

The Java Tutorials — Creating a GUI With JFC/Swing > Concurrency in Swing > Initial Threads > Initial Threads
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

Java Tutorials Code Sample — HelloWorldSwing.java
http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java

p.333
(誤) この式では、DocumentオブジェクトのgetElementByTagName()を呼び出し、
(正) この式では、DocumentオブジェクトのgetElementsByTagName()を呼び出し、

※ getElementByTagName() → getElementsByTagName()。以下の訂正も同様。

p.333
(誤) "body"を引数にしてgetElementByTagName()を呼び出すと
(正) "body"を引数にしてgetElementsByTagName()を呼び出すと

p.333
(誤) HTMLタグでは大文字と小文字を区別しないので、getElementByTagName()に渡す文字列も大文字と小文字
(正) HTMLタグでは大文字と小文字を区別しないので、getElementsByTagName()に渡す文字列も大文字と小文字

p.334
(誤) さらに、HTMLドキュメントの場合は、HTMLDocumentオブジェクトにgetElementByName()メソッドも
(正) さらに、HTMLドキュメントの場合は、HTMLDocumentオブジェクトにgetElementsByName()メソッドも

※ getElementByName() → getElementsByName()

p.417
(誤) DOMレベル1では、すべてのドキュメント要素を操作可能にし、これらの要素で
(正) DOMレベル2では、すべてのドキュメント要素を操作可能にし、これらの要素で

p.419
(誤) ElementsとDocumentがこのインタフェースを実装し、
(正) ElementとDocumentがこのインタフェースを実装し、
※ Elements → Element

p.452
(誤) // Firefoxは e.charCode に印刷文字キーを格納し、IEは e.charCodeに格納する。
(正) // Firefoxは e.charCode に印刷文字キーを格納し、IEは e.keyCodeに格納する。

p.456
(誤) * などの基本型の値を指定する。data には、任煮のJavaScript値が指定できる。
(正) * などの基本型の値を指定する。data には、任意のJavaScript値が指定できる。
※ 任煮 → 任意

p.540
(誤) この例では、例21-6と同じようにXMLドキュメントをHTMLテーブルに変換します。
(正) この例では、例21-7と同じようにXMLドキュメントをHTMLテーブルに変換します。
※ 例21-6 → 例21-7

p.545
(誤) // この関数は引数として名前空間を受け取り、
(正) // この関数は引数として名前空間プレフィックスを受け取り、

p.588
(誤) この例では、makeVMLCanvas()関数とpiChart()
(正) この例では、makeVMLCanvas()関数とpieChart()

p.612
最下行
(誤) Packageオブジェクトから、
(正) Packagesオブジェクトから、



p.354
JavaScriptらしくないコーディング。

(オリジナル)
    // すべての見出しレベル用の節番号を結合して、

// [2.3.1]のような節番号を生成する。
var sectionNumber = "";
for (i = 0; i < level; i++) {
sectionNumber += sectionNumbers[i];
if (i < level - 1)
sectionNumber += ".";
}
(改訂案)
    // すべての見出しレベル用の節番号を結合して、

// [2.3.1]のような節番号を生成する。
var sectionNumber = sectionNumbers.slice(0, level).join(".");
以上
<<XMLとJavaによるWebアプリケーション開発 第2版 第2版第2刷 正誤表 | ホーム | Windows Update (KB2647516, KB2656356, KB2618444) 80070011 エラー>>

コメント

コメントの投稿

管理者にだけ表示を許可する

画像の文字を半角数字で下記ボックスに記入ください。
文字が読みにくい場合はブラウザの更新をすると新しい文字列が表示されます。