The errata list is a list of errors and their corrections that were found after the product was released. If the error was corrected in a later version or reprint the date of the correction will be displayed in the column titled "Date Corrected".
The following errata were submitted by our customers and approved as valid errors by the author or editor.
Version |
Location |
Description |
Submitted By |
Date submitted |
Date corrected |
Printed |
Page passim
passim |
The spelling varies between "same-origin policy" and "same origin policy". A more consistent spelling is welcome.
Note from the Author or Editor: Found on page 513; replaced "same origin" with "same-origin".
|
Saašha Metsärantala |
Dec 29, 2011 |
Aug 29, 2014 |
Printed |
Page XV
Chapter "Errata and how ..." |
The web site for errata
http:/oreilly.com/catalog/9780596805531
should read
http://oreilly.com/catalog/errata.csp?isbn=9780596805531
|
Lutz Adam |
Jan 21, 2012 |
Aug 29, 2014 |
Printed |
Page various
various |
In my eyes the message of section 6.2.3 is, that
if(book.subtitle)
should make sure the existence of this property.
But according to section 15.5.2 such a
simple "if(...)" does not take care of an empty string.
In both situations I don' t understand, why
the in-operator (see section 4.9.3) must stay
unused for those questions.
Note from the Author or Editor: Change code sample to:
// A verbose and explicit technique
var len = undefined;
if (book) {
if ("subtitle" in book) len = book.subtitle.length;
}
// A concise and idiomatic alternative to get subtitle length or undefined
var len = book && ("subtitle" in book) && book.subtitle.length;
|
Anonymous |
Sep 02, 2013 |
Aug 29, 2014 |
Printed |
Page page 405
code |
var args = document.referrer.substring( ref.indexOf("?") + 1). split("&");
Flanagan, David (2011-04-18). JavaScript: The Definitive Guide (Definitive Guides) (p. 405). O'Reilly Media. Kindle Edition.
correct version:var args = document.referrer.substring( referrer.indexOf("?") + 1). split("&");
Note from the Author or Editor: Change line to:
var args = document.referrer.substring(document.referrer.indexOf("?")+1).split("&");
|
Maria Grynychyn |
Dec 29, 2013 |
Aug 29, 2014 |
|
1
Table of Contents |
In the Safari Online PDF (which is no longer labeled as a Rough Cut), in the PDF table of contents for Parts III and IV, the different entries don't actually take you to their associated pages. This DRASTICALLY reduces the usefulness of this PDF as a reference.
Note from the Author or Editor: Resolution: Is this still a problem? Sounds like something to fix. I
don't know what a Safari PDF is unless it is the same as the normal PDF,
but available through safari to those who bought the rough cut...
|
Beau |
Apr 30, 2011 |
Aug 29, 2014 |
Printed |
Page 4
3rd comment in 1.1 |
?variable? could be written with a capital v
Note from the Author or Editor: Change "variable is a symbolic name for a value." to "A variable is a symbolic name for a value."
|
Angelos Sphyris |
Aug 05, 2013 |
Aug 29, 2014 |
Printed |
Page 5
2nd paragraph of text |
?The use of . and [] ? for example? could be better written: ?For example, the use of . and [] to refer to the value of an object property or array element yields an expression.?
Note from the Author or Editor: Rephrase as per description of error.
|
Angelos Sphyris |
Aug 05, 2013 |
Aug 29, 2014 |
Printed |
Page 6
4th line of comments |
the comma before ?too? should be omitted
Note from the Author or Editor: Change wording to avoid the comma altogether:
points[1].x - points[0].x // => 1: more complicated operands work, too
becomes
points[1].x - points[0].x // => 1: more complicated operands also work
|
Angelos Sphyris |
Aug 05, 2013 |
Aug 29, 2014 |
PDF |
Page 9
Last paragraph |
The sentence in the last paragraph that reads:
A function is a named and parametrized block...
should read:
A function is a named and parameterized block...
Note from the Author or Editor: I suspect that the spelling of parametrized is a house style
issue. I don't care either way. Please check and leave it as is if the
e was dropped intentionally.
|
Javier Estrada |
Jul 19, 2011 |
Aug 12, 2011 |
Printed |
Page 11
code example for the "load" event |
I couldn?t get function hide to work. Instead, I used:
function hide(event) {
var target = event.target ? event.target : event.srcElement;
//srcElement needed for IE8, target for Chrome and FireFox
target.style.visibility = "hidden";
}
Note from the Author or Editor: Changed code for function to:
function hide(event) {
// srcElement needed for IE8, target for Chrome and Firefox
var target = event.target ? event.target : event.srcElement;
target.style.visibility = "hidden";
}
|
Angelos Sphyris |
Aug 05, 2013 |
Aug 29, 2014 |
Printed |
Page 13
Example 1.1 |
The <tr> lines for Repayment period and Zipcode do not have matching </tr> codes. Although the code seems to work fine without them, I've always been told that it's "good programming practice" to include them. (I've also downloaded the code from the website, and found it also has the same problem.)
Note from the Author or Editor: Added </tr> tags at end of the lines:
|
Clark Jones |
Jul 06, 2013 |
Aug 29, 2014 |
Printed |
Page 19
First sentence |
"This part of the book, Chapters 2 though 12,...."
should read
"This part of the book, Chapters 2 through 12,..."
Note from the Author or Editor: Make change as specified: "This part of the book, Chapters 2 through 12,..."
|
Mikael Strand |
May 21, 2013 |
Aug 29, 2014 |
Printed |
Page 33
4th paragraph (1st after lines of code) |
??when a negative value becomes larger than the largest representable negative number??: From a mathematical point of view, this is incorrect and confusing. It should be rephrased in any of the following two ways:
??when a negative value becomes smaller than the smallest representable negative number??
or
??when the absolute value of a negative number becomes larger than the absolute value of the largest representable negative number??
Note from the Author or Editor: Change to ??when the absolute value of a negative number becomes larger than the absolute value of the largest representable negative number??
|
Angelos Sphyris |
Aug 23, 2013 |
Aug 29, 2014 |
PDF |
Page 34
1st source code fragment |
Number.MAX_VALUE + 1 evaluates to 1.7976931348623157e+308 instead of Infinity, like the affirmation in the code comment. The result of the expression Number.MAX_VALUE + 1 is equal to Number.MAX_VALUE. The equality can be verified with the following test:
Number.MAX_VALUE + 1 === Number.MAX_VALUE that returns true.
-Number.MIN_VALUE - 1 evaluates to -1.7976931348623157e+308 instead of -Infinity, like the affirmation in the code comment. The result of the expression -Number.MAX_VALUE - 1 is equal to -Number.MAX_VALUE. The equality can be verified with the following test:
-Number.MAX_VALUE - 1 === -Number.MAX_VALUE that returns true.
Note from the Author or Editor: Replace Number.MAX_VALUE + 1 with Number.MAX_VALUE * 2 and Number.MIN_VALUE -1 with Number.MIN_VALUE * 2; this does results in Infinity
|
Rog?rio Moraes de Carvalho |
Dec 23, 2012 |
Aug 29, 2014 |
Printed |
Page 35
last line |
?hours in UTC time; depends on timezone? Is this really so? I thought UTC time was absolute and it was the local time, which was dependent on the timezone.
Note from the Author or Editor: Changed line to:
later.getUTCHours() // hours in UTC time
|
Angelos Sphyris |
Oct 01, 2013 |
Aug 29, 2014 |
Other Digital Version |
36
Second set of examples in String Literals section |
The comment describing the one-line string written on 3 lines is nested within the string literal. This makes the comment part of the string literal and the backslash is not part of a line continuation.
Note from the Author or Editor: Move comment to precede the strings:
// A string representing 2 lines written on one line
"two\nlines"
// A one-line string written on 3 lines. ECMAScript 5 only.
"one\
long\
line"
|
Evan Thomas |
Sep 09, 2011 |
Aug 29, 2014 |
Printed |
Page 40
section 3.3, 7th paragraph |
The first occurrence of the word 'truthy' is written in the font used for programme code. Perhaps this is a formatting error.
Note from the Author or Editor: Set "truthy" in italic.
|
Angelos Sphyris |
Oct 01, 2013 |
Aug 29, 2014 |
PDF |
Page 41
Last paragraph |
The last paragraph starts with the following sentence:
"+, ==, != and the relational operators are the only ones that perform this special kind of string-to-primitive conversions"
I believe that instead of "string-to-primitive conversions" it should've been "object-to-primitive conversions". Two reasons:
1) The specific conversion the author is probably referring to is described above using the "object-to-primitive" term
2) String is already a primitive, so the "string-to-primitive conversion" term makes no sense.
Note from the Author or Editor: Change text to read "...perform this special kind of object-to-primitive conversions"
|
Anonymous |
Jun 12, 2013 |
Aug 29, 2014 |
PDF |
Page 43
4th paragraph under section 3.6 Wrapper Objects |
The text
'There are not wrapper objects for the null and undefined values' should be changed to
'There are no wrapper objects for the null and undefined values'
|
Shuaib Mohammad |
Sep 28, 2012 |
Aug 29, 2014 |
PDF |
Page 43
4th paragraph (after the 1st sample code) |
The following phrase is confusing: "Strings are not objects, though, so why do they have properties?".
This affirmation is not true for every case. For example, in the following code, myString is an object:
var myString = new String("this is my string");
I think that the text could be modified to: "Primitive strings are not objects, though, so why do they have properties?".
Then, the author must explain the difference between primitive strings, and string objects.
The String documentation on String global object has a topic, called "Distinction between string primitives and String objects" that is superb. The following sample code is enlightening:
var s_prim = "foo";
var s_obj = new String(s_prim);
console.log(typeof s_prim); // Logs "string"
console.log(typeof s_obj); // Logs "object"
Note from the Author or Editor: Change "Strings are not objects" to "Primitive strings are not objects"
|
Rog?rio Moraes de Carvalho |
Dec 24, 2012 |
Aug 29, 2014 |
Printed |
Page 46
Table 3-2, lower left cell, middle |
I have convinced myself that the text "[9] (1 nuemeric elt)" is using "elt" as an abbreviation for "element". However, I had to stop and think about this. It is generally better to introduce abbreviations when first using them.
Note from the Author or Editor: If it is possible to so without word wrap, change "(1 numeric elt)" to "(one numeric element)"
|
Anonymous |
Sep 17, 2011 |
Aug 29, 2014 |
PDF |
Page 58
JavaScript source code after the 3rd text paragraph |
The comment of the first line reserved word primary expression has the word "Evalutes" instead of "Evaluates".
|
Rogerio Moraes de Carvalho |
Dec 25, 2012 |
Aug 29, 2014 |
PDF |
Page 58
The paragraph before the topic title 4.2 Object and Array Initializers |
"When any identifier appears by itself in a program, JavaScript assumes it is a variable and looks up its value."
Until here, the information is correct. The topic 3.10.3 (Scope Chain) explain how the variable is look up through the source code.
"If no variable with that name exists, the expression evaluates to the undefined value. In the strict mode of ECMA 5, however, an attempt to evaluate a nonexistent variable throws a ReferenceError instead."
Even in EcmaScript 3, a nonexistent variable throws a ReferenceError. I used the following code to test.
try {
console.log(nonexistVariable);
}
catch (e) {
console.log(e.toString());
}
I got the following error: "ReferenceError: nonexistVariable is not defined". (All browsers throws the ReferenceError, but the messages are slightly different).
Note from the Author or Editor: Replace sentence starting "If no variable..." with: If no variable with that name exists, an attempt to evaluate a nonexistent variable throws a ReferenceError instead.
|
Rogerio Moraes de Carvalho |
Dec 25, 2012 |
Aug 29, 2014 |
Printed |
Page 59
Last line on page. |
The code example:
var square = function(x) { return x * x; }
should include a final semi-colon at the end of the line to reflect best practices as well as to continue the correlation between object and array literals that precede it (where this syntax is used properly):
var square = function(x) { return x * x; };
Note from the Author or Editor: Include a final semi-colon at the end of the line:
var square = function(x) { return x * x; };
(The same example on page 7, though split across several lines, has a semicolon after the closing brace.)
|
Scott Marcus |
Nov 29, 2011 |
Aug 29, 2014 |
Printed |
Page 59
3rd paragraph |
?A single trailing comma is allowed?undefined element.? I can understand what is meant here, yet the sentence can prove somewhat confusing, because if we define:
var a = [1,,3,]
then a[3] is undefined. In fact, a[i] for all i >= 3 is undefined. I would emphasise the phrase ?not create? and add a further sentence, such as: ?However any array access expression for an index after that of the last expression will necessarily evaluate to undefined?.
Note from the Author or Editor: Add wording: "However, any array access expression for an index after that of the last expression will necessarily evaluate to undefined." Did not emphasise the phrase "not create"
|
Angelos Sphyris |
Oct 01, 2013 |
Aug 29, 2014 |
PDF |
Page 60
3rd paragraph |
This second expression specifies the name of the desired property OF the index of the desired array element.
should read
This second expression specifies the name of the desired property OR the index of the desired array element.
Note from the Author or Editor: fix, please
|
leppie |
Apr 27, 2011 |
Aug 12, 2011 |
PDF |
Page 60
4th paragraph |
I initially misinterpreted the sentence "If the value is not an object (or array), it is converted to one (see ?3.6)." I thought that the value would be converted to either an object OR AN ARRAY (depending on context somehow) but this is not the case; it is always converted to an object. I suggest changing the end of this sentence to "..., it is converted to an object". This phrasing would have prevented my confusion.
Note from the Author or Editor: Make change as per description of error.
|
TadMarshall |
Sep 18, 2011 |
Aug 29, 2014 |
PDF |
Page 60
5th paragraph |
In the first sentence in this paragraph, "when you know then name" should be "when you know the name".
Note from the Author or Editor: Make change as in description of error.
|
TadMarshall |
Sep 18, 2011 |
Aug 29, 2014 |
|
60
2nd to last paragraph |
Replace the following (change indicated in between asterisks):
"...it can only be used when the property you want to access has a name that is a legal
identifier, and when you know *then* name when you write the program."
with:
" it can only be used when the property you want to access has a name that is a legal
identifier, and when you know *the* name when you write the program."
|
Anonymous |
Jul 29, 2012 |
Aug 29, 2014 |
PDF |
Page 60
2nd paragraph of the topic 4.4 Property Access Expressions |
Note the asterisks in the following paragraph detached phrase:
"This second expression specifies the name of the desired property *of* the index of the desired array element."
The correct must be "or" instead of "of".
Note from the Author or Editor: Already fixed in current version of PDF.
|
Rogerio Moraes de Carvalho |
Dec 25, 2012 |
Aug 29, 2014 |
Printed |
Page 60
5th paragraph |
For "know then name" read "know the name".
|
Martin Leese |
Dec 30, 2012 |
Aug 29, 2014 |
Printed |
Page 60
5th paragraph |
?If the property name is a reserved word ? you must use the square bracket notation.?
However, the following works:
var p = { "goto" : 1,
"void" : 2
};
p.goto + p.void //=> 3
Note from the Author or Editor: Commenter's example works correctly in both Firefox and Chrome, latest versions. Action:
Comment out <!--is a reserved word or-->
|
Angelos Sphyris |
Oct 01, 2013 |
Aug 29, 2014 |
Printed, PDF |
Page 62
Table 4-1 JavaScript operators |
This is really a question about an omission from Table 4-1.
In the table of JavaScript operators, Table 4-1 starting on page 62, the expressions '[ ]', '( )' and '.' are omitted from the start of the table.
Although these are really expressions rather than operators, most experienced programmers from other languages (e.g. C and Java) would want them to be there, for convenience. It is useful to think of them as operators when reading code. The book isn't a strict reference like the ECMAScript standard, it's a book for learning the language.
FWIW, Crockford includes them in his 'operator precedence' table in JavaScript: The Good Parts (which I ended up referring to in order to find out about these expressions/operators).
Please add them to the table!
Note from the Author or Editor: Split this off into a new table at the end of the preceding section, with this text preceding the table:
<para><xref linkend="exprPriority" /> gives the precedence for these expressions. They are all of higher priority than the operators shown in <xref linkend="operators" />. The expressions listed first have higher precedence than those listed last. Expressions separated by a horizontal line have different precedence levels. The column labeled A gives the expression associativity, which can be L (left-to-right) or R (right-to-left).</para>
|
Alan Rew |
May 10, 2012 |
Aug 29, 2014 |
PDF |
Page 75
Fourth line before 4.10 title |
"If it finds it, then o is an instance of f (or of a superclass of f) and the operator returns true."
Shouldn't it be "a subclass of f"? Otherwise the Liskov Subtitution Principle would not be valid for JavaScript.
Note from the Author or Editor: Correct. If I ask whether a Date is an instanceof Object, the answer is yes, because Date is a subclass of Object.
Action: change "a superclass of" to "a subclass of"
|
Sergio Arbeo |
Sep 17, 2011 |
Aug 29, 2014 |
PDF |
Page 75
examples near top of page |
Lines 2, 3, 4, 6, 7 and 8 should not have semicolons, to match the style of other examples in the book. In other examples, statements end in semicolons while expressions such as '1 + 2' or (here) 'd instanceof Date'' do not.
Note from the Author or Editor: Remove semicolons from lines containing expressions:
var d = new Date(); // Create a new object with the Date() constructor
d instanceof Date // Evaluates to true; d was created with Date()
d instanceof Object // Evaluates to true; all objects are instances of Object
d instanceof Number // Evaluates to false; d is not a Number object
var a = [1, 2, 3]; // Create an array with array literal syntax
a instanceof Array // Evaluates to true; a is an array
a instanceof Object // Evaluates to true; all arrays are objects
a instanceof RegExp // Evaluates to false; arrays are not regular expressions
|
TadMarshall |
Sep 18, 2011 |
Aug 29, 2014 |
|
75
3rd paragraph |
Section 4.9.4: The InstanceOf Operator
Last sentence of 2nd text paragraph (ignoring code sample) reads: If the right-hand side is not a function, it throws a TypeError.
I believe "function" should be "object" or "Class of Objects".
Note from the Author or Editor: Reword to "If the right-hand side is not a class of objects,..."
|
Greg Edwards |
Mar 22, 2013 |
Aug 29, 2014 |
PDF |
Page 77
3d paragraph, second code example |
function copy(o, p) {
p = p || {}; // If no object passed for p, use a newly created object.
// function body goes here
}
I believe properties of O should be assigned to P.
function copy(o, p) {
p = o || {}; // If no object passed for p, use a newly created object.
// function body goes here
}
Note from the Author or Editor: Make change as specified in description of error.
|
V?ctor |
Dec 11, 2013 |
Aug 29, 2014 |
PDF, Other Digital Version |
Page 80
First paragraph, Last sentence |
If this isn't a typo, the intended meaning isn't clear.
If the string throws an exception, the
eval() propagates that expression.
should be
If the string throws an exception, the
eval() propagates that exception.
Note from the Author or Editor: Change it to:
If the evaluated string throws an exception, that exception
propagates from the call to eval().
|
Andrew Hart |
Jun 11, 2011 |
Aug 12, 2011 |
|
84
1st example at "4.13.3 The delete Operator" |
The delete operator example for array at 4.13.3 is described below, however, I've found that a.length is still 3 even after "delete a[2]" on my FireFox5 and Chorme14.
var a = [1,2,3]; // Start with an array
delete a[2]; // Delete the last element of the array
a.length // => 2: array only has two elements now
The specification of delete operator on FireFox at
https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/delete_Operator
says that "When you delete an array element, the array length is not affected." so this example is wrong.
Note from the Author or Editor:
Change this line:
a.length // => 2: array only has two elements now
To these two lines:
2 in a // => false: array element 2 doesn't exist anymore
a.length // => 3: note that array length doesn't change, though
Line the comments up with the ones above, of course.
Also, if you can make it fit somehow, add the following at the end of
the paragraph that follows after "with the in operator (??4.9.3).":
Deleting an array element leaves a "hole" in the array and does not
change the array's length. The resulting array is
<emphasis>sparse</emphasis> (see ??7.3).
|
Shigeki Ohtsu |
Jun 29, 2011 |
Aug 12, 2011 |
PDF |
Page 84
last line in the first example group |
a.lenth
should be
a.length
Apparently fallout from fixing the confirmed erratum on this line (reported by Shigeki Ohtsu), since the typo does not appear in that report.
Note from the Author or Editor: change a.lenth to a.length
|
TadMarshall |
Sep 19, 2011 |
Aug 29, 2014 |
Printed |
Page 92
Section 5.3.2: 1st line on page 92 |
Like variables declared with var, functions defined with function definition statements are implicitly "hosted" ...
should read:
Like variables declared with var, functions defined with function declaration statements are implicitly "hosted" ...
Note from the Author or Editor: Change text to: "...functions defined with function declaration statements are implicitly ?hoisted? to the top of the containing script or function"
|
April |
Sep 06, 2011 |
Aug 29, 2014 |
PDF |
Page 95
repeated if/else -> switch statement example |
The comments for the switch statement cases are using the wrong equality operator.
In the book: "Start here if n == x"
Correct: "Start here if n === x"
Explanation:
The switch statement uses the strict equality operator to determine which case to branch to as you mention yourself just a few lines above the example. The comments should therefore use the correct equality operator.
Note from the Author or Editor: Change "==" to "===" in three comments on page 95.
|
Ole Rasmussen |
May 20, 2011 |
Aug 12, 2011 |
PDF |
Page 95
third paragraph |
The section on switch statements includes this statement: "Various locations in the block of code are labeled with the case keyword followed by an expression and a colon. case is like a labeled statement". But labeled statements haven't been covered yet (they are covered later in the chapter), so it is odd to use it in as an analogy.
Note from the Author or Editor: Confirmed. Added a link to the appropriate section:
...is like a labeled statement (see <xref linkend="labeledstatements" />), except that instead of giving the labeled statement a name
|
Anonymous |
Jan 09, 2012 |
Aug 29, 2014 |
|
119
code example in 6.2.1 |
The example is missing the right curly bracket in the for-loop as below.
var addr = "";
for(i=0; i < 4; i++){
add += cusotmer["address" + i] + '\n';
Note from the Author or Editor: Remove the unbalanced "{" after "i++)". Note that this code
is on page 121 in my pdf.
|
Shigeki Ohtsu |
Jul 12, 2011 |
Aug 12, 2011 |
PDF |
Page 127
function merge.... |
function merge(o, p) {
.....
if (o.hasOwnProperty[prop]) continue;
....
}
Shouldn't the square brackets be round brackets instead? ie.
if (o.hasOwnProperty(prop)) continue;
Note from the Author or Editor: Change square brackets to round brackets as in description of error.
|
Jeremy Peck |
Aug 17, 2011 |
Aug 29, 2014 |
Printed |
Page 127
in code for function merge() |
The code in function merge() should have parentheses surrounding prop rather than square brackets in the line:
if (o.hasOwnProperty(prop)) continue;
NOT
if (o.hasOwnProperty[prop]) continue;
Also, in all of the examples on page 127, it would be better to include a var expression inside the for/in loop. That is:
for (var prop in p)
instead of
for (prop in p)
Note from the Author or Editor: Square brackets -> parentheses is a duplicate; change
for (prop in p)
to
for (var prop in p)
in all examples on page 127; also change
for (p in o)
to
for (var p in o)
in examples on pages 126 and 127.
|
Jeff Tash |
Nov 12, 2012 |
Aug 29, 2014 |
Printed |
Page 128
2nd function |
The function "union"'s comment section notes that "If o and p have properties by the same name, the values from o are used". It should read "the values from p are used".
Note from the Author or Editor: change the comment as the reader suggests
|
Dave Gibson |
Jun 02, 2011 |
Aug 12, 2011 |
|
128
code example in 6.6 |
The code example below is for obtaining a polar coordinate of (0,0) with the inherited object. The radius and theta at the coordinate origin point are not intuitive so that it's better to change the point into (0,1) or whatever not (0,0)
var q = inherit(p);
q.x = 0, q.y = 0;
console.log(q.r);
console.log(q.theta);
Note from the Author or Editor: Change this line:
q.x = 0, q.y = 0; // Create q's own data properties
To this:
q.x = 1; q.y = 1; // Create q's own data properties
Note the numbers change and the comma changes to a semicolon.
Note also that this is on page 130 of my pdf.
|
Shigeki Ohtsu |
Jul 12, 2011 |
Aug 12, 2011 |
PDF |
Page 128
1/3 below the top of the page |
The function "function union(o,p) { return extend(extend({},o), p); }" has the following comment:
>>> If o and p have properties by the same name, the values from o are used.
The values from o are actually being OVERWRITTEN based on the order of parameters. If he wants o to be used, then he has use p first, that is
return extend(extend({},p),o);
To keep this simple, please change the comment to "the values from o are overwritten by those of p."
For discussion, here:
http://stackoverflow.com/questions/7019807/the-definitive-guide-6ed-error
Note from the Author or Editor: Latest XML source for the book already has this change. The line now reads:
If o and p have properties by the same name, the values from p are used.
|
Yeukhon Wong |
Aug 11, 2011 |
Aug 29, 2014 |
Printed |
Page 130
Serial number example |
The comment in the code and the error message thrown state that the new value must be larger than the existing value. However, the code accepts equal values in the 'if' test: n >= this.$n
Strictly speaking, the test should be: n > this.$n
Note from the Author or Editor: Change line to if (n > this.$n) this.$n = n;
|
David Sletten |
Dec 18, 2012 |
Aug 29, 2014 |
Printed |
Page 135
code at bottom |
Object.prototype.isPrototypeOf(o) // => true: p inherits from Object.prototype
Should read,
Object.prototype.isPrototypeOf(o) // => true: o inherits from Object.prototype
Note from the Author or Editor: The reader is correct that there is a problem, but the
proposed solution is wrong.
Change the line:
Object.prototype.isPrototypeOf(o) // =>; true: p inherits from Object.prototype
To:
Object.prototype.isPrototypeOf(p) // =>; true: p inherits from Object.prototype
|
Evan Carroll |
Jun 20, 2011 |
Aug 12, 2011 |
Printed |
Page 135
Middle of page |
The text states that objects created by means of Object.create() have a constructor property that refers to the Object() constructor. However, both Chrome (23.0.1271.64) and Safari (5.1.7) report:
Object.create(new Date()).constructor =>
function Date() { [native code] }
The book is correct, however, in explaining that constructor.prototype here does not refer to the correct prototype:
var d = Object.create(new Date());
d.constructor.prototype === Object.getPrototypeOf(d) => false
d.constructor.prototype === Object.getPrototypeOf(Object.getPrototypeOf(d)) => true
Note from the Author or Editor: Change "Note that objects created by object literals or by Object.create() have a constructor property that refers to the Object() constructor."
to:
"Note that objects created by object literals or by Object.create() with an object literal as their first argument have a constructor property that refers to the Object() constructor."
|
David Sletten |
Dec 21, 2012 |
Aug 29, 2014 |
Printed |
Page 143
3 |
The second sentence of this paragraph reads:
"All indexes are property names, but only property names that are integers between 0 and 2^32 - 1 are indexes."
This is misleading. According to the ECMAScript spec (section 15.4, both the 3rd and 5th edition):
"A property name P (in the form of a String value) is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to 2^32 - 1."
So the second sentence of your paragraph should read:
"All indexes are property names, but only property names that are integers between 0 and 2^32 - 2 are indexes."
Thanks so much for writing this book!
Note from the Author or Editor: Good catch! Change
2<superscript>32</superscript>-1
to
2<superscript>32</superscript>-2
|
Anonymous |
May 08, 2011 |
Aug 12, 2011 |
PDF |
Page 144
5th paragraph ("Note that when you omit...") |
quote from Ch. 7.3 p. 144 >>>
"Note that when you omit value in an array literal, you are not creating a sparse array. The omitted element exists in the array and has the value undefined. This is subtly different than array elements that do not exist at all. You can detect the difference between these two cases with the in operator:
var a1 = [,,,]; // This array is [undefined, undefined, undefined]
var a2 = new Array(3); // This array has no values at all
0 in a1 // => true: a1 has an element with index 0
0 in a2 // => false: a2 has no element with index 0"
<<< end of quote
However, v8 implementation of this differs from what the book suggests; both "0 in a1" and "0 in a2" are false. Also, the developers say v8 follows the ECMAScript specification. If that is true, the quoted text is erroneous.
The issue is discussed in the following v8 bug which also contains a quote from the ECMAScript specification:
http://code.google.com/p/v8/issues/detail?id=1371
Note from the Author or Editor: Resolution: Yuck! The 4th paragraph of page 144 plus the 4 lines of
code after it plus the one line paragraph after the code all have to be
removed and replaced with the following:
Note that when you omit a value in an array literal (using repeated
commas as in <literal>[1,,3]</literal>) the resulting array is sparse
and the omitted elements simply do not exist:
var a1 = [,]; // This array has no elements and length 1
var a2 = [undefined]; // This array has one undefined element
0 in a1 // => false: a1 has no element with index 0
0 in a2 // => true: a2 has the undefined value at index 0
Some older implementations (such as Firefox 3) incorrectly insert the
<literal>undefined</literal> values in array literals with omitted
values. In these implementations <literal>[1,,3]</literal> is the
same as <literal>[1,undefined,3]</literal>.
Also, on page 142, the 3rd paragraph and the two lines that follow and
the paragraph after that must be changed as follows:
If an array literal contains multiple commas in a row, with no value
between, the array is sparse (see 7.3). Array elements for which
values are omitted do not exist, but appear to be
<literal>undefined</literal> if you query them:
var count = [1,,3]; // Elements at indexes 0 and 2. count[1] => undefined
var undefs = [,,]; // An array with no elements but a length of 2
Array literal syntax allows an optional trailing comma, so
<literal>[,,]</literal> has a length of 2, not 3.
Hopefully these two changes sort of balance each other out and do not
cause too many page break changes. Let me know if you need to shorten
or lengthen them.
|
Marja Hölttä |
May 09, 2011 |
Aug 12, 2011 |
Printed, PDF |
Page 147
1st paragraph code example |
In section 7.6 "Iterating Arrays", a code example is given which shows a technique for "exclud[ing] null, undefined, and nonexistent elements" while iterating through a sparse array. The important bit is:
if (!a[i]) continue; // Skip null, undefined, and nonexistent elements
However, this conditional will also exclude falsy elements, which does not appear to match the intention of the technique. Either this should be mentioned in the text or the conditional should be changed.
Note from the Author or Editor: Change if (!a[i]) continue; to:
if (a[i] === null || a[i] === undefined)
|
Louis Wust |
Jun 29, 2013 |
Aug 29, 2014 |
Printed |
Page 148
Section 7.8 |
for "under Array in the client-side reference section" read "under Array in the core reference section".
Note from the Author or Editor: Change as per description of error.
|
Martin Leese |
Dec 30, 2012 |
Aug 29, 2014 |
Printed |
Page 150
First Line |
return a-b; //Returns < 0, 0, or > 0, depending on order
should read
return a-b; //Returns < 0, 0, or > 0, depending on order
Note from the Author or Editor: Change as per description of error.
|
Anonymous |
Oct 10, 2011 |
Aug 29, 2014 |
Printed |
Page 151
Paragraph 2 |
The book discusses what happens when the 2nd argument to splice() is omitted. However, section 15.4.4.12 of the standard does not identify the 2nd argument (deleteCount) as being optional in the splice() method signature. Furthermore, after describing the algorithm for splice(), the standard explicitly states: The length property of the splice method is 2.
The algorithm (step 7) defines a value, actualDeleteCount, to be: min(max(ToInteger(deleteCount),0), len ? actualStart)
When deleteCount is omitted its value is undefined. This appears to result in a value of 0 being assigned to actualDeleteCount. But this also seems to be the case when a value of 0 is passed for deleteCount. Yet the behavior is very different in the 2 cases.
In Chrome/Safari/node.js when deleteCount is omitted, splice() behaves as the book describes. But when 0 is passed explicitly, no elts are removed.
I'm missing something in my understanding of the algorithm, but should this behavior when deleteCount is omitted be relied on?
Note from the Author or Editor: Add paragraph at end of section: Note also that the one-argument call to splice() is not defined in the ECMAScript 5 standard; it is an extension that works in modern browsers.
|
David Sletten |
Dec 25, 2012 |
Aug 29, 2014 |
Other Digital Version |
153
Last line of filter() section |
The expression for the return statement in the example is "x !== undefined && x != null". Either use !== for both comparisons or simplify it to x != null.
Note from the Author or Editor: Change x!= null to x !== null (consistent, and best practice)
|
Evan |
Sep 26, 2011 |
Aug 29, 2014 |
Other Digital Version |
156
Last paragraph of reduce(), reduceRight() section |
The text states that "the union() function uses the value of that property from the first argument." Errata for the definition of union (on page 128) has corrected the description of union to use the value from the second argument.
Note from the Author or Editor: Change "the first argument" to "the second argument".
|
Evan |
Sep 26, 2011 |
Aug 29, 2014 |
Printed |
Page 156
3rd example code |
I found incorrect result at comment.
Now
var objects = [{x:1,a:1}, {y:2,a:2}, {z:3,a:3}];
var leftunion = objects.reduce(union); // {x:1, y:2, z:3, a:1}
var rightunion = objects.reduceRight(union); // {x:1, y:2, z:3, a:3}
I think result
var objects = [{x:1,a:1}, {y:2,a:2}, {z:3,a:3}];
var leftunion = objects.reduce(union); // {x:1, y:2, z:3, a:3}
var rightunion = objects.reduceRight(union); // {x:1, y:2, z:3, a:1}
adjusting point
// {x:1, y:2, z:3, a:1} -> // {x:1, y:2, z:3, a:3}
// {x:1, y:2, z:3, a:3} -> // {x:1, y:2, z:3, a:1}
Note from the Author or Editor: Change code to read:
var leftunion = objects.reduce(union); // {x:1, y:2, z:3, a:3}
var rightunion = objects.reduceRight(union); // {x:1, y:2, z:3, a:1}
|
Hitoshi Mori |
Jul 10, 2012 |
Aug 29, 2014 |
Printed |
Page 156
Paragraph 3 |
The book suggests using reduceRight() for a reduction operation with "right-to-left precedence". This term is meaningless as it stands and should be changed to "right-to-left associativity" consistent with the language of section 4.7.6 used to refer to a right-associative operator.
Note from the Author or Editor: Change text as per description. ("precedence" becomes "associativity")
|
David Sletten |
Dec 25, 2012 |
Aug 29, 2014 |
Printed |
Page 157
Paragraph 4 |
The book states that the string indexOf() and lastIndexOf() methods work like the corresponding array methods do. This may be true overall, but one specific difference is that the string versions don't accept negative values for the 2nd optional position argument.
According to section 15.5.4.7 (and 15.5.4.8) of the standard, both indexOf() and lastIndexOf() compute their starting index in terms of max(pos, 0), where pos is the result of ToInteger(position). Consequently, a negative position is simply treated as 0 for the string versions unlike the array versions.
Note from the Author or Editor: Change text to read "methods that work like these array methods, except that a negative second argument is treated as zero."
|
David Sletten |
Dec 25, 2012 |
Aug 29, 2014 |
Printed, PDF |
Page 158
Between 3rd & 4th paragraph |
The following code is incorrect:
var isArray = Function.isArray || function(o) {
return typeof o === "object" &&
Object.prototype.toString.call(o) === "[object Array]";
};
The Function.isArray should be Array.isArray so that it reads as:
var isArray = Array.isArray || function(o) {
return typeof o === "object" &&
Object.prototype.toString.call(o) === "[object Array]";
};
Note from the Author or Editor: Change Function.isArray to Array.isArray as per description of error.
|
Anonymous |
Nov 26, 2012 |
Aug 29, 2014 |
Printed, PDF |
Page 159
2nd line from the bottom |
"it does not property expand that object into the returned array."
should read:
"it does not properly expand that object into the returned array."
Note from the Author or Editor: Make change as per description of error.
|
Mingway Huang |
Aug 31, 2011 |
Aug 29, 2014 |
Printed |
Page 159
Paragraph 2 |
The function isArrayLike() strives to weed out objects that are not array-like, particularly those simply possessing a length property. The comments indicate that strings are rejected by the function. This is true for string primitives but not for String objects which will evaluate to true by isArrayLike().
Furthermore, the upper limit for the value of length is not quite right. As pg. 141 correctly points at, and as the erratum reported for pg. 143 highlights, the length must be strictly less than Math.pow(2, 32) -1. So the function should either test:
o.length < Math.pow(2, 32) - 1
or
o.length <= Math.pow(2, 32) - 2
Note from the Author or Editor: Change line from:
o.length < 4294967296) // o.length < 2^32
to:
o.length< 4294967295) // o.length < 2^32 - 1
|
David Sletten |
Dec 25, 2012 |
Aug 29, 2014 |
Printed |
Page 160
Bottom of page |
var s = test;
Presumably intended:
var s = "test";
Note from the Author or Editor: Change as per detailed description.
|
David Sletten |
Dec 25, 2012 |
Aug 29, 2014 |
Printed |
Page 160
bottom of page |
var s = test should be var s = "test"
Note from the Author or Editor: Put in the quote marks.
|
Anonymous |
Jun 29, 2014 |
Aug 29, 2014 |
PDF |
Page 165
last sentence |
Variable declarations are hoisted (see ?3.10.1, but assignments...
shoudld be:
Variable declarations are hoisted (see ?3.10.1), but assignments...
Note from the Author or Editor: Yes, add the missing close paren
|
Anonymous |
Jul 26, 2011 |
Aug 12, 2011 |
Printed |
Page 165
Top of page |
The book gives an example of a function expression that is invoked directly. But there does not seem to be any discussion in the book about the necessity of the enclosing parentheses around such an invocation.
This is a syntax error (discussed in section 12.4 of ECMA-262):
function(x) {return x*x;}(10)
But either of these appears to be legal:
(function(x) {return x*x;}(10))
(function(x) {return x*x;})(10)
In fact, the example in the book does not seem to require the enclosing parentheses (in Chrome, Safari):
var tensquared = function(x) {return x*x;}(10);
But I'm not sure that this is consistent with the standard.
Some mention of this issue (perhaps in section 4.5) would be helpful.
Note from the Author or Editor: Add parentheses; line now reads:
var tensquared = (function(x) {return x*x;}(10));
|
David Sletten |
Dec 26, 2012 |
Aug 29, 2014 |
|
169
Section 8.2.2, second paragraph after the "Method Chaining" boxed note |
David,
In the sentence "Unlike variables, the this keyword does not have a scope, and nested functions to not inherit the this value of their caller.", I think you meant to say that nested functions do not inherit the this value of their "outer function". As you mention later in the paragraph, one might mistakenly assume that the inner function body has the this value in effect where it is defined (in the manner of a closure), but nobody would suspect that an inner function gets the *caller's* this.
I'm seeing this in the rough cuts April 16th PDF version.
Great book! Best Regards,
Tom
Note from the Author or Editor: Change "do not inherit the this value of their caller" to
"do not inherit the <literal>this</literal> value of the containing
function".
|
Anonymous |
Apr 29, 2011 |
Aug 12, 2011 |
Printed |
Page 169
Second paragraph after the text box |
Unlike variables, the this keyword does not have a scope, and nested functions do not inherit the this value of the containing.
-> Missing a word at the end of the sentence, probably "function".
Note from the Author or Editor: Add word "function" at end of sentence.
|
Anonymous |
Oct 11, 2011 |
Aug 29, 2014 |
Printed |
Page 172
Bottom of page |
In my opinion, the max() function could be improved:
function max(x) {
var max = x;
for (var i = 1; i < arguments.length; i++) {
if ( arguments[i] > max ) {
max = arguments[i];
}
}
return max;
}
The original version takes the unusual step of initializing the maximum value with a value (Number.NEGATIVE_INFINITY) that is presumably not even one of the args passed to the function. Furthermore, it produces the odd behavior: max() => -Infinity
(Of course, this is how Math.max() behaves...)
But more importantly, I think it would be helpful to point out that in the example, the local variable 'max' shadows the function name. This is kind of an unusual situation and might cause problems for recursive functions.
Note from the Author or Editor: While an improvement, the text says that ?see also the built-in function Math.max(), which behaves the same way?, so I believe the code should indeed do what Math.max() does.
Change var max to var maxValue to avoid the shadowing problem.
function max(x) {
var maxValue = Number.NEGATIVE_INFINITY;
// Loop through the arguments, looking for, and remembering, the biggest.
for(var i = 0; i < arguments.length; i++)
if (arguments[i] >maxValue) maxValue = arguments[i];
// Return the biggest
return maxValue;
}
|
David Sletten |
Dec 27, 2012 |
Aug 29, 2014 |
Printed |
Page 175
Bottom of page |
The function 'flexisum' declares a parameter 'a' that is never used. This may be a copy-paste error from the function 'sum' earlier on the page, which does use its parameter 'a'.
Note from the Author or Editor: Remove parameter "a"; first line of function becomes
function flexisum() {
|
David Sletten |
Dec 27, 2012 |
Aug 29, 2014 |
Printed |
Page 180
Bottom of Example 8-3 |
In Example 8-3, the nested patched_extend(o) function references the protoprops variable defined in its surrounding function, but the assignment of an array of strings to the protoprops variable is unreachable code. The declaration of the protoprops variable will be hoisted, but since the unnamed outer function will always return either the extend(o) or the patched_extend(o) function before the assignment statement itself is executed, the value of protoprops should always be undefined.
Note from the Author or Editor: This is another good catch.
Move the 4 lines beginning with the blank line before this one:
// This is the list of...
Up so that they appear right after this line:
// properties of Object.prototype.
You should end up with a 4-line comment block, followed by a blank line,
followed by a one line comment, followed by 2 lines beginning "var
protoprops = " followed by the line "return function patched_extend(0)
{" and all the code that follows that. The example should still end
with the line "}());"
|
Matthew Engel |
Jul 27, 2011 |
Aug 12, 2011 |
Printed |
Page 183
Bottom of page |
Same issue as pg. 130. Test should be: m > n
Note from the Author or Editor: Change m >= n to m > n
|
David Sletten |
Jan 04, 2013 |
Aug 29, 2014 |
Printed |
Page 186
3rd paragraph |
JSDG appears to make note of where behavior differs in ECMA 3/5 throughout, and perhaps it should here as well:
function check(args) {
var actual = args.length;
var expected = args.callee.length;
if(actual !== expected) {
throw Error("Expected " + expected + "args; got " + actual);
}
}
with "use strict" I get the following expected exception from Firefox 9.0.1.
TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them.
This is what I expect base on section 8.3.2.1 (page 173).
So in ECMA5, is there any way to way write a function accomplishing the desire behavior?
Note from the Author or Editor: Current PDF now has a comment:
// This function uses arguments.callee, so it won't work in strict mode.
(I do not know if it is possible to write this in strict mode.)
|
Ketil Wright |
Jan 23, 2012 |
Aug 29, 2014 |
Printed |
Page 188
Bottom of page |
The function assigned to 'sum' is missing a semicolon from its return statement.
The function 'f' is also missing a semicolon from its return statement and has an extraneous semicolon after the function statement.
Note from the Author or Editor: Change code to read:
var sum = function(x,y) { return x + y; };
function f(y,z) { return this.x + y + z; }
|
David Sletten |
Jan 08, 2013 |
Aug 29, 2014 |
Printed |
Page 190
First paragraph |
The 6th edition of the book appears to replace the 5th edition terms "function definition statement" and "function literal [expression]" with the terms "function declaration statement" and "function definition expression". Page 190 reverts to the earlier terms.
Note from the Author or Editor: Change "function definition statement" to "function declaration statement", and "function literal" to "function definition expression" as per description of error.
|
David Sletten |
Jan 12, 2013 |
Aug 29, 2014 |
PDF |
Page 191
2nd paragraph at 8.7.7 Callable Objects |
in the book: "getElementsById()"
should be: "getElementById()"
Note from the Author or Editor: Make change as in description of error.
|
HIROKI OGASAWARA |
Sep 20, 2011 |
Aug 29, 2014 |
Other Digital Version |
192
implementation of reduce |
The "if (i == len)" statement causes reduce to throw a TypeError when it is called with an array containing a single element and no initial value.
Note from the Author or Editor: Change
if (i == len)
to
if (i == len && len > 1)
|
Evan |
Sep 26, 2011 |
Aug 29, 2014 |
PDF |
Page 192
implementation of map |
To explain my submission in detail the above, the map() function on the page 192 is defined for both ES3 and ES5, however, in ES5 it has an optional value of the object as the second argument.
So it can be changed into the following so as to fit the exact specification of the Array.prototype.map in ES5.
var map = Array.prototype.map
? function(a, f, o) { return a.map(f, o); }
: function(a, f, o) {
var results = [];
for(var i = 0, len = a.length; i < len; i++) {
if (i in a) results[i] = f.call(o || null, a[i], i, a);
}
return results;
};
Note from the Author or Editor: Changed code as provided.
Code should read:
var map = Array.prototype.map
? function(a, f, o) { return a.map(f, o); } // Use map method if it exists
: function(a,f, o) { // Otherwise, implement our own
var results = [];
for(var i = 0, len = a.length; i < len; i++) {
if (i in a) results[i] = f.call(o || null, a[i], i, a);
}
return results;
};
Thank you for providing the code!
|
HIROKI OGASAWARA |
Oct 25, 2011 |
Aug 29, 2014 |
Printed |
Page 195
Bottom of page |
The final example on the page uses partial() to define a function that returns the last "character" of a string. The example uses the substr() function. However, the reference entry for substr() on pg. 849 identifies this function as nonstandard and deprecated.
Instead:
String.prototype.last = partial(String.prototype.slice, -1);
Note from the Author or Editor: Replace
String.prototype.last = partial(String.prototype.substr, -1, 1);
with
String.prototype.last = partial(String.prototype.slice, -1);
|
David Sletten |
Jan 13, 2013 |
Aug 29, 2014 |
Printed |
Page 201
code example at top of page |
The provided code does not work in Chrome, though is fine in Firefox. The snippet that throws errors in chrome is: foreach: function(f) {for(var x = Math.ceil(this.from); x <= this.to; x++ ) f(x);}
Note from the Author or Editor: Change r.foreach(console.log) to the verbose solution: r.forEach(function(x) {console.log(x);})
|
Ben Petersen |
Sep 07, 2011 |
Aug 29, 2014 |
Printed |
Page 201
Top of page |
As Ben Petersen previously noted, this sample code does not work:
r.foreach(console.log)
According to the following StackOverflow entry, the problem is related to aliasing the console.log function:
http://stackoverflow.com/questions/5133649/alias-to-chrome-console-log
The simple fix--bind to the 'console' object:
r.foreach(console.log.bind(console))
Another more verbose solution--avoid the alias:
r.foreach(function(x) {console.log(x);})
The problem occurs in Chrome and Safari, although Ben says Firefox works.
Note from the Author or Editor: Change r.foreach(console.log) to the verbose solution: r.forEach(function(x) {console.log(x);})
|
David Sletten |
Dec 31, 2012 |
Aug 29, 2014 |
PDF |
Page 203
last line |
c === F // => true: F.prototype.constructor==F for any function
Should that comment be so?
c === F // => true: F.prototype.constructor===F for any function
Note from the Author or Editor: Sure. Change == in the comment to ===. And if it will fit,
add spaces on both sides of ===. I probably used == to save space, but
it looks like we can fit more characters on the line.
|
Anonymous |
Aug 02, 2011 |
Aug 12, 2011 |
Printed |
Page 203
Chapter 9.2.1, 2nd par. |
[First line of paragraph] Even THROUGH constructors are not ...
"THROUGH" should read "THOUGH"
Note from the Author or Editor: Change "through" to "though"
|
Lutz Adam |
Jan 19, 2012 |
Aug 29, 2014 |
Printed |
Page 208
Section 9.4: First paragraph |
<pre>
Page 208: Section 9.4: First paragraph:
... an object inherits properties from its prototype, even if the prototype
changes after the object is created.
is at least misleading. 'prototype' is the name of a pointer/reference to a
object which contains the prototypical properties since arrays/objects are
referenced by pointer/reference (section 3.7).
This is a perfect example of pointer/reference access to one object using
different copies of the same pointer/reference.
I think saying 'even if the prototype's properties, but not the actual
prototype, changes, since the prototype is referenced by pointer/reference ...'
would be clearer and let one see just why changes in the prototype do affect
old objects.
SAMPLE:
=======
I will look at an object which is an instance of a class for which the
prototype is created as a property of the constructor. I will use 'print'
for output (the spider monkey stand alone interpreter's output function).
If you change the prototype itself, the POINTER to the object of
prototypical values, then new objects use the new prototype but
*OLD OBJECTS USE THE OLD PROTOTYPE*. The new objects (objects created after
the prototype changes) contain pointers to the new object containing the
new prototype values while the old objects use the old prototype
(pointer/reference to the old prototype's object).
function Test1() {};Test1.prototype={a:1,b:2}
T=new Test1
print(T.a);print(T.b);print(T.c)
Test1.prototype={a:10,b:20,c:30}
U=new Test1
print(T.a);print(T.b);print(T.c)
print(U.a);print(U.b);print(U.c)
gives 1, 2, undefined [original T before the prototype has changed]
1,2, undefined [original T AFTER the prototype has changed] <--
10,20,30 [U - created AFTER the prototype has changed]
T retains the old prototype, i.e. the pointer to the old prototype's
object.
On the other hand, if you change the CONTENTS of the prototype object
but not the prototype (i.e. the pointer/object containing the values):
function Test2() {};Test2.prototype={a:1,b:2}
V=new Test2
print(V.a);print(V.b);print(V.c)
Test2.prototype.a=10;Test2.prototype.b=20;Test2.prototype.c=30
W=new Test2
print(V.a);print(V.b);print(V.c)
print(W.a);print(W.b);print(W.c)
Then one gets:
1, 2, undefined [original V before the prototype has changed]
10,20,30 [original V AFTER the prototype has changed] <--
10,20,30 [W - created AFTER the prototype has changed]
If an instance of an class contained a reference to its constructor
(instead of the constructor's prototype) and actually used that to access
the prototype object of its class/constructor (rather than having a
pointer to the prototype object used when it was constructed itself)
then one could change the prototype object (not just its contents)
(as a property of the constructor) and the changed prototype would affect
both new *and old* instances:
function Test3() {this.constructor=Test3}; Test3.prototype={a:1,b:2}
X=new Test3
print(X.constructor.prototype.a);print(X.constructor.prototype.b);print(X.constructor.prototype.c)
Test3.prototype={a:10,b:20,c:30}
Y=new Test3
print(X.constructor.prototype.a);print(X.constructor.prototype.b);print(X.constructor.prototype.c)
print(Y.constructor.prototype.a);print(Y.constructor.prototype.b);print(Y.constructor.prototype.c)
produces:
1, 2, undefined [original X before the prototype has changed]
10,20,30 [original X AFTER the prototype has changed]
10,20,30 [Y - created AFTER the prototype has changed]
Now I wonder what intricacies are created when a constructor which is
an internal function to another is called - if the constructor's
'prototype' is set equal (f.prototype=p) to an internal variable of
the containing function ... or various properties of the prototypical
object are set equal to internal variables ....
</pre>
Note from the Author or Editor: Okay, change "even if the prototype changes" to "even if the
properties of the prototype change"
|
Anonymous |
Jul 05, 2011 |
Aug 12, 2011 |
Printed |
Page 209
Top of page |
A minor discrepancy with the comment above the 'times' function. Rather than printing "hello" 3 times, the example actually prints:
0 hello
1 hello
2 hello
Furthermore, in the code wouldn't it be more straightforward to use this.valueOf() rather than Number(this) since we're already dealing with a Number object?
Note from the Author or Editor: Change comment to:
// n.times(function(n) { console.log("hello"); });
and code to:
var n = this.valueOf();
|
David Sletten |
Jan 20, 2013 |
Aug 29, 2014 |
Printed |
Page 212
Top and bottom of page |
The explanation of the type() function hints that it uses the getName() function from pg. 209. However, the version on pg. 212 differs from the one on pg. 209. In particular, the new version actually creates a 'name' property on the Function objects it examines. This new behavior should be highlighted.
Note from the Author or Editor: Add sentence: "The code for that function and method are included here for simplicity. The Function.getName() method has been modified to create a name property on the Function objects it examines."
|
David Sletten |
Jan 21, 2013 |
Aug 29, 2014 |
Printed |
Page 216
Middle of page |
A number of example functions in the text do not conform to JavaScript naming conventions. On pg. 216, the foreach() method defined for Set objects contrasts with the forEach() method of Array objects. The same is true on pg. 201 with the foreach() method of Range objects.
Likewise, pg. 136 and 212 define a classof() function. However, based on the example of the valueOf() method of Object instances, it seems that the function should be named classOf() instead.
Note from the Author or Editor: Corrected forEach; classof seems to be in the same group as typeof and instanceof., but since it is a method and not a keyword, it will change also.
|
David Sletten |
Feb 02, 2013 |
Aug 29, 2014 |
PDF |
Page 216
right on top |
// For any object, return a string. This function will return a different
// string for different objects, and will always return the same string
// if called multiple times for the same object. To do this it creates a
// property on o. In ES5 the property would be nonenumerable and read-only.
function objectId(o) {
var prop = "|**objectid**|"; // Private property name for storing ids
if (!o.hasOwnProperty(prop)) // If the object has no id
o[prop] = Set._v2s.next++; // Assign it the next available
return o[prop]; // Return the id
}
Obviously, this code doesn't create a property that's nonenumerable and read-only, it creates a regular one. That's so obvious that maybe the author meant something else when saying that, like that he would write a specific property creation code that would add a nonenumerable and read-only property in case he was gonna use the ES5 features.
Note from the Author or Editor: Amend comment for clarity:
// For any object, return a string. This function will return a different
// string for different objects, and will always return the same string
// if called multiple times for the same object. To do this it creates a
// property on o. In ES5 you would use Object.defineProperty() to
// make the property nonenumerable and read-only.
|
Anonymous |
Aug 27, 2013 |
Aug 29, 2014 |
Printed |
Page 218
Top of page |
The for/in loop neglects to declare the variable 'name' with 'var'. 'name' becomes a global variable.
Note from the Author or Editor: change loop to read:
for(var name in namesToValues) {
|
David Sletten |
Feb 16, 2013 |
Aug 29, 2014 |
Printed |
Page 226
1st paragraph |
At the end of the first sentence: "...allowing access to that state only through the methods of the object, and NOW allowing the important state variables to be read or written directly."
I believe that NOW should be NOT:
"...and NOT allowing the important state variables to be read or written directly."
Note from the Author or Editor: Change "now" to "not" as per detailed description:
"...allowing access to that state only through the methods of the object, and not allowing the important state variables to be read or written directly."
|
Daniel Pfeiffer |
Aug 13, 2011 |
Aug 29, 2014 |
Printed |
Page 232
Middle of page |
The add() methods for both Set and NonNullSet each return a this reference in order to support method chaining. However, the add() method of sets created by means of filteredSetSubclass() does not.
Note from the Author or Editor: Change code to read:
return superclass.prototype.add.apply(this, arguments);
|
David Sletten |
Feb 25, 2013 |
Aug 29, 2014 |
Printed |
Page 233
Middle of page |
In the example using composition to define FilteredSet there is no point in naming the constructor function object (the first argument to Set.extend()). The name is not used anywhere and may lead to confusion when juxtaposed with the variable to which the return value of Set.extend() is assigned. Furthermore, the parallels with NonNullSet on the previous page are clearer if an anonymous constructor is used.
Note from the Author or Editor: Change code to:
var FilteredSet = Set.extend(
function(set, filter) { // The constructor
|
David Sletten |
Feb 26, 2013 |
Aug 29, 2014 |
PDF |
Page 234
last code fragment before 9.7.4 |
var t = new FilteredSet(s, { function(x} { return !(x instanceof Set); });
should it be as following?
var t = new FilteredSet(s, function(x) {return !(x instanceof Set); });
Note from the Author or Editor: Change function(x} to function(x)
|
Anonymous |
Aug 12, 2011 |
Aug 29, 2014 |
Printed |
Page 238
Example 9-17 |
Example 9-17 throws an Error by simply invoking the Error() function. This is inconsistent with the 3 instances in Example 9-16 (and elsewhere) that invoke Error() as a constructor via the 'new' operator. While both uses are equivalent in this case, the result can be (dramatically) different with other constructors.
Also the idGetter() function definition ends with an extraneous semicolon.
Note from the Author or Editor: Change code to read:
throw new Error("Can't define id for nonextensible objects");
|
David Sletten |
Mar 09, 2013 |
Aug 29, 2014 |
PDF |
Page 240
Example 9-19 implementation of freezeProps and hideProps |
The following statement causes getOwnPropertyDescriptor to throw a TypeError when it returns "undefined".
if (!Object.getOwnPropertyDescriptor(o,n).configurable) return;
ex.
freezeProps({x:1, y:2}, "y", "z"); // => TypeError
hideProps({x:1, y:2}, "y", "z"); // => TypeError
Shouldn't it be check the value of the property "n" exist or not? ie.
if (o.hasOwnProperty(n) && !Object.getOwnPropertyDescriptor(o,n).configurable) return;
Note from the Author or Editor: Change code to:
if (o.hasOwnProperty(n) && !Object.getOwnPropertyDescriptor(o,n).configurable) return;
in both functions, as described in erratum.
|
HIROKI OGASAWARA |
Oct 25, 2011 |
Aug 29, 2014 |
Printed |
Page 240
Top of page |
In example 9-19, the functions freezeProps() and hideProps() use the technique Array.prototype.splice.call(arguments, 1) to extract all arguments passed to the function, aside from the first, into an array. It doesn't really matter in these functions, but in general it's probably advisable to use slice() rather than splice(), so that the arguments object is not modified.
Note from the Author or Editor: Change
Array.prototype.splice.call(arguments, 1);
to
Array.prototype.slice.call(arguments, 1);
|
David Sletten |
Mar 10, 2013 |
Aug 29, 2014 |
Printed |
Page 243
Middle of page |
In Example 9-22, the function which defines the size property has a stray parameter 'x' that is neither used nor needed.
Note from the Author or Editor: Change line to read:
size: { value: function() { return this.n; } },
|
David Sletten |
Mar 14, 2013 |
Aug 29, 2014 |
Other Digital Version |
246
First paragraph of Modules section |
ECMAScript 5 reserves the keywords "import" and "export" not the keywords "imports" and "exports".
Note from the Author or Editor: Make correction as specified in description.
|
Evan |
Sep 29, 2011 |
Aug 29, 2014 |
Printed |
Page 266
4th paragraph |
"It defines functions using function definition expressions only and does not include the function definition statement."
There is no "function definition statement", but should be "function declaration statement", according to chapter 8.
Note from the Author or Editor: Change as per detailed description of error.
|
Rong Zeng |
Mar 02, 2012 |
Aug 29, 2014 |
Printed |
Page 267
7th paragraph |
Last sentence of 7th paragraph reads "Others whitelist a specific set of properties know to be safe."
Probably should read "Others whitelist a specific set of properties known to be safe."
Note from the Author or Editor: Change as per detailed description.
|
Joel E Merritt |
Sep 30, 2013 |
Aug 29, 2014 |
Printed |
Page 270
JavaScript version number |
Should "ten" be replaced by "one hundred"? The text reads:
"version number times ten. Pass 170 to select JavaScript 1.7"
Note from the Author or Editor: Replace "version number times ten." with "version number times 100." (Numbers greater than ten are written using digits per O'Reilly Style guide.)
|
Saašha Metsärantala |
Dec 29, 2011 |
Aug 29, 2014 |
Printed |
Page 270
fourth to las line |
variable is shadowing A NEW variable by the same name:
"A NEW" should read "AN OLD".
Note from the Author or Editor: Change text from:
This matters only when the new variable is shadowing a new variable by the same name:
to:
This matters only when the new variable is shadowing an old variable by the same name:
|
Lutz Adam |
Jan 21, 2012 |
Aug 29, 2014 |
Printed |
Page 274
1st paragraph of section 11.4.2 |
"JavaScript 1.7's for/in loop is more like Python's for/in and allows it iterate over any iterable object." probably should read "JavaScript 1.7's for/in loop is more like Python's for/in and allows it to iterate over any iterable object."
Note from the Author or Editor: Change words: "...and allows it iterate over any..." to "... and allows it to iterate over any..." (add word "to")
|
Joel E Merritt |
Oct 01, 2013 |
Aug 29, 2014 |
Printed |
Page 285
5th code fragment |
// This is yet another way to get a list of all <name> tags. var
names3 = pt.element.*;
probably should be
// This is yet another way to get a list of all <name> tags.
var names3 = pt.element.*;
Note from the Author or Editor: Add line break after "tags."
|
Joel E Merritt |
Oct 01, 2013 |
Aug 29, 2014 |
Printed |
Page 291
1st paragraph - "As you see..." |
( sixth Edition - 12.1 Scripting Java with Rhino | 291 )
path in source code -> "/tmp/test"
path in text below -> "/type/test/"
Note from the Author or Editor: Change as in description: /type/test becomes /tmp/test
|
Dirk Zoettl |
Jul 26, 2013 |
Aug 29, 2014 |
Printed |
Page 291
3rd text paragraph (not counting code examples) |
the JavaScript string "/type/test" is automatically converted
should probably read
the JavaScript string "/tmp/test" is automatically converted
Note from the Author or Editor: Change "/type/test" to "/tmp/test" as per description of error.
|
Joel E Merritt |
Oct 01, 2013 |
Aug 29, 2014 |
Printed |
Page 308
fourth to last paragraph |
// Explicitly alter the presentation of the HEADING element
"HEADING" should read "TIMESTAMP".
Note from the Author or Editor: Change
// Explicitly alter the presentation of the heading element
to
// Explicitly alter the presentation of the element
(We don't know what kind of element had the id="timestamp")
|
Lutz Adam |
Jan 21, 2012 |
Aug 29, 2014 |
Printed |
Page 309
Example 13.1 |
Hello!
In example 13.1, the JavaScript program loops through elements of the class "reveal". In this example, there is only ONE such element, though. I assume that the aim is that this program should work fine even if the dom contains several elements of this class, otherwise, you would not need to loop through them all.
But, if you add elements of the class "reveal", it will not work: No matter on which of these elements you click, only the last one will be toggled.
This problem is exactly what Douglas Crockford explains on page 39 in "The good parts".
Regards!
Saašha,
Note from the Author or Editor: This is an embarassing bug, that is explained on page 185 of the book.
Please change JavaScript code in the example to the code shown here: https://github.com/davidflanagan/javascript6_examples/blob/master/examples/13.01.reveal.html
|
Saašha Metsärantala |
Dec 31, 2011 |
Aug 29, 2014 |
Printed |
Page 312
second code snippet |
Mr.Flanagan wrote that when XML is being used, the actual code in a <script> tag should be enclosed within the tags
<![CDATA[ ... ]]>. He meant to write <!--[CDATA[ ... ]] -->. But even the corrected version works only in IE8. The corrected version makes the JavaScript invisible to FireFox (at this site, Mozilla/5.0 (Windows NT 5.1; rv:10.0) Gecko/20100101 Firefox/10.0).
Note from the Author or Editor: Change example to:
<script>
// <![CDATA[
// Your JavaScript code goes here
// ]]>
</script>
|
Thomas Paulick |
May 26, 2012 |
Aug 29, 2014 |
PDF |
Page 337
3rd paragraph from the bottom |
Just a minor formatting issue.
In the sentence "...without altering nonexecutable HTML.toStaticHTML() is not standardized..." there is a line break in the middle of "HTML.toStaticHTML()". I believe it was done unintentionally.
Note from the Author or Editor: Take out blanks in "a more nuanced toStatic HTML() " and add a <phrase> in markup to keep the next toStaticHTML() together.
|
Mikhail Kalenkov |
Oct 02, 2011 |
Aug 29, 2014 |
Printed |
Page 342
Example 14-1 |
I found that the code for the timer utility function "invoke" works as shown in IE9, Chrome and Safari, but Firefox 10.0.2 throws an error message "repeat is not defined" when using all four arguments.
I think this is because the function repeat is defined within an else clause. According to page 91 (penultimate para) of the book, this is not allowed (or at least not portable). The error went away when I moved the function definition below the closing curly bracket of the else.
Note from the Author or Editor: Moved the repeat function below the closing brace of the "else" clause, as in the description of error.
|
timhuckvale |
Mar 07, 2012 |
Aug 29, 2014 |
PDF |
Page 343
3rd paragraph, section 14.2 Browser location and Navigation |
The book states:
"The Document object also has a URL property, which is a static string that holds the URL of the document when it was first loaded. If you navigate to fragment identifiers (like ?#table-of-contents?) within the document, the Location object is updated to reflect this, but the document.URL property remains unchanged."
This is untrue, document.URL is same as location.href, it does change to reflect the fragment identifier.
Note from the Author or Editor: Change text to read: If you navigate to fragment identifiers (like ?#table-of-contents?) within the document, both the Location object and the document.URL property are updated to reflect this.
|
Anonymous |
Aug 25, 2012 |
Aug 29, 2014 |
Printed |
Page 345
end of section14.3 |
The book states that the code
location.search = "?page=" + (pagenum+1);
loads the next page. In reality, it only reloads the same page with the new query string that was written above.
Note from the Author or Editor: Change line to read:
location.search = "?sold=" + (sold+1); // reload page with new query string
(changed from "page" to "sold" to avoid confusion with prevoius example)
|
Thomas Paulick |
May 31, 2012 |
Aug 29, 2014 |
Printed |
Page 350
near top of code sample |
The statement for displaying the modal dialog box is written:
var p = showModalDialog("multiprompt.htm", ['Enter 3D point coordinates','x','y','z'], "dialogwidth:400; dialogheight:300; resizable:yes");
Firefox displays the modal dialog correctly with this statement, but IE8 requires units for the height and width of the dialog:
var p = showModalDialog("multiprompt.htm", ['Enter 3D point coordinates','x','y','z'], "dialogwidth:400px; dialogheight:300px; resizable:yes");
Also, the IE JavaScript safety wall prevents the "Okay" and "Close" buttons from working correctly.
Note from the Author or Editor: Add px to the dimensions as described in error:
var p = showModalDialog("multiprompt.html",
["Enter 3D point coordinates", "x", "y", "z"],
"dialogwidth:400px; dialogheight:300px; resizable:yes");
|
Thomas Paulick |
May 31, 2012 |
Aug 29, 2014 |
Printed |
Page 351
14.7 first paragraph |
"... and whose name is the HTMLElement ..."
should read:
and whose value is the HTMLElement
Note from the Author or Editor: yes, make that change.
|
jonsen |
May 27, 2011 |
Aug 12, 2011 |
PDF |
Page 362
html example code |
<html>
<head>
<title>Sample Document</title>
</head>
<body>
<h1>An HTML Document</h1>
<p>This is a <i>simple</i> document.
</html>
</body> tag missing in above code
Note from the Author or Editor: Add </body> tag before closing </html> tag.
|
zziuni |
Aug 19, 2011 |
Aug 29, 2014 |
PDF |
Page 367
3rd paragraph |
HTMLDocument's scripts propertys description printed....
<scripts> property is standardized by HTML5 to be an HTMLCollection of <script> elements, but it is not, at the time of this writing, universally implemented.
is
scripts property is standardized by HTML5 to be an HTMLCollection of <script> elements, but it is not, at the time of this writing, universally implemented.
Note from the Author or Editor: Eliminate angle brackets from <scripts> property as per detailed description.
|
zziuni |
Aug 19, 2011 |
Aug 29, 2014 |
Printed |
Page 368
section 15.2.4, first sentence |
The sentence starts with
"The class attribute of an HTML is ..."
The word 'element' is missing from after 'HTML', i.e. should read
"The class attribute of an HTML element is ..."
Note from the Author or Editor: Add "element" after "HTML", as in detailed description of error.
|
Alan Rew |
Mar 29, 2012 |
Aug 29, 2014 |
Printed |
Page 369
Section 15.2.5, 3rd paragraph |
'Any <span> with "warning" and "fatal" in its class' shoud read 'Any <span> with "fatal" and "error" in its class'
|
Ken Wilson |
Aug 01, 2011 |
Aug 12, 2011 |
PDF |
Page 375
15.4.1section first paragraph |
HTMLElement defines properties for the universal HTTP attributes such as id, title lang, and dir, and event handler properties like onclick.
maybe.. HTTP attributes is HTML attributes ?
Note from the Author or Editor: Change HTTP to HTML, as per detailed description, and also add comma after "title".
|
zziuni |
Aug 28, 2011 |
Aug 29, 2014 |
Printed |
Page 378
example in 2nd para |
ymin assigned twice, second time must be: ymax=parseFloat(...);
Following line (assigning points) must be removed, because points not used any further and "data-points" not in HTML.
Note from the Author or Editor: Code should read:
var ymax = parseFloat(elt.getAttribute("data-ymax"));
and remove the line starting "var points "
|
Paul E.S. Wormer |
Nov 24, 2011 |
Aug 29, 2014 |
Printed |
Page 379
6th paragraph, first sentence. |
The sentence refers to the insertAdjacentHTML() method as:
insert Adjacent HTML()
The spaces should be removed.
Note from the Author or Editor: Remove spaces as per detailed description.
|
Scott Marcus |
Dec 02, 2011 |
Aug 29, 2014 |
Printed, PDF |
Page 382
section 15.6.1 |
The API name createElement() is split over 2 lines
The API name createComment() is also split over 2 lines.
Note from the Author or Editor: Remove extra spaces in docbook source
|
Alan Rew |
May 10, 2012 |
Aug 29, 2014 |
Printed |
Page 383
example 15.4 |
When I take the table from:
http://www.w3schools.com/html/tryit.asp?filename=tryhtml_table_cellspacing
and use FF 8, I get the error "cell1 undefined".
The problem is that the first row does not contain <td> elements but <th> elements. Solution is:
rows = Array.prototype.slice.call(rows,1); // Snapshot in a true array
instead of
rows = Array.prototype.slice.call(rows,0); // Snapshot in a true array
Note from the Author or Editor: Change as per detailed description of error.
|
Paul E.S. Wormer |
Nov 26, 2011 |
Aug 29, 2014 |
Printed, PDF |
Page 394
5th and 8th paragraphs |
In the 5th paragraph, the API name scrollIntoView() is split over 2 lines.
In the 8th paragraph, the property name offsetParent is split over 2 lines.
Splitting API and property names reduces readability unnecessarily.
Note from the Author or Editor: Add <phrase> to source markup to keep on one line.
|
Alan Rew |
May 10, 2012 |
Aug 29, 2014 |
Printed, PDF |
Page 396
2nd paragraph from bottom of page |
The API name getBoundingClientRect() has spaces inserted into its name, when used in the 3rd and 4th lines of the paragraph.
In the first case, it's written as
getBoundingClient Rect()
and in the second case
getBounding ClientRect()
The name is also split across 2 lines in both places, which should be avoided if possible for readability.
Note from the Author or Editor: Eliminate spaces in the source docbook.
|
Alan Rew |
Apr 02, 2012 |
Aug 29, 2014 |
Printed, PDF |
Page 398
table at top of page, for input type=text |
In the table entry for
<input type="text">
the 'Description and events' column says
"... the default <input> element it type attribute is ..."
The word 'it' should be replaced with 'if'
Note from the Author or Editor: Change as per detailed description:
single-line text entry field; the default <input> element if type attribute is omitted or unrecognized.
|
Alan Rew |
May 10, 2012 |
Aug 29, 2014 |
Printed |
Page 398
8th entry in table |
For "<input> element it type attribute" read "<input> element if type attribute".
|
Martin Leese |
Dec 30, 2012 |
Aug 29, 2014 |
Printed |
Page 405
8th paragraph headed "title" |
For "<title> and <title>" read "<title> and </title>".
Note from the Author or Editor: As per detailed description, change second "<title>" to "</title>"
|
Martin Leese |
Dec 30, 2012 |
Aug 29, 2014 |
PDF |
Page 406
15.10.2 example code |
end of script in the example code:
document.write("<br>Accessed on: " + new Date());
should end with closing tag.
document.write("<br>Accessed on: " + new Date() + "</p>");
Browsers append </p> automatically though, we should not rely on such behavior.
Note from the Author or Editor: Change as specified in description of error:
|
iwanaga |
Sep 06, 2012 |
Aug 29, 2014 |
PDF |
Page 416
16.1.4, 2nd sentence, 1st paragraph |
Firefox CSS extensions are prefixed with "-moz-"
Therefore, the beginning:
Firefox uses moz-, ...
has to be corrected as:
Firefox uses -moz-, ...
https://developer.mozilla.org/en-US/docs/CSS/CSS_Reference/Mozilla_Extensions
|
iwanaga |
Oct 29, 2012 |
Aug 29, 2014 |
Printed |
Page 436
1st example, after 2nd paragraph |
The example that reads:
var title = document.getElementById("sectiontitle");
var titlestyles = window.getComputedStyle(element, null);
should read:
var title = document.getElementById("sectiontitle");
var titlestyles = window.getComputedStyle(title, null);
Note from the Author or Editor: Change code to read as in description of error.
|
jazy Chas |
Aug 20, 2011 |
Aug 29, 2014 |
Printed |
Page 447
5th paragraph |
"how to work with a specific types of events." should read
"how to work with specific types of events." or
"how to work with a specific type of events."
Note from the Author or Editor: Change sentence to read: "The chapter ends with a series of examples that demonstrate how to work with specific types of events."
|
Joel E Merritt |
Oct 20, 2013 |
Aug 29, 2014 |
Printed, PDF |
Page 459
middle of page |
middle of the page: removeEventListener()
There is a space between 'remove' and 'Event', which is definitely a mistake.
Note from the Author or Editor: Remove spaces in docbook source.
|
Anonymous |
Dec 13, 2011 |
Aug 29, 2014 |
Printed, PDF |
Page 463
3rd paragraph from bottom of page |
The API 'addEventListener' is split up into 3 words i.e. "add Event Listener()" near the end of the paragraph.
Note from the Author or Editor: Removed spaces from docbook source.
|
Alan Rew |
Apr 02, 2012 |
Aug 29, 2014 |
PDF |
Page 463
2nd paragraph of Section 17.3.6 |
Replace "an" with "a":
You might register an ?change? handler on a <form> element, ...
=>
You might register a ?change? handler on a <form> element, ...
Note from the Author or Editor: Replace as specified in detailed description.
|
Anonymous |
Nov 29, 2013 |
Aug 29, 2014 |
Printed |
Page 471
4th paragraph, opening sentence |
Text says "In Firefox you can the nonstandard ...".
Should it read "In Firefox you use the nonstandard ..."?
|
Ken Wilson |
Aug 03, 2011 |
Aug 29, 2014 |
Printed |
Page 473
second last line |
There is a missing 'e' in the second 'framewidth':
framewidth = Math.min(framwidth, contentwidth); // content
should be:
framewidth = Math.min(framewidth, contentwidth); // content
Note from the Author or Editor: Change "framwidth" to "framewidth" as specified in detailed description.
|
Anonymous |
Jan 13, 2012 |
Aug 29, 2014 |
Printed |
Page 496
3rd paragraph |
2nd sentence states that the URL in open() is relative to the URL of the document that contains the script that is calling open(). Need to add to this sentence, "... unless the document contains a <base> tag, in which case the URL is relative to that."
Note that some older browsers (eg, Netscape 7.02) do not respect this.
Note from the Author or Editor: Add text to sentence as per description:
, unless the document contains a <base> tag, in which case the URL is relative to that. (Some very old browsers, e.g., Netscape 7.02, do not respect this.)
|
Martin Leese |
Dec 30, 2012 |
Aug 29, 2014 |
Printed |
Page 498
second bullet point |
The space between 'Response' and 'Headers' should be removed, i.e. the API is getAllResponseHeaders()
Note from the Author or Editor: Remove spaces as per description
|
Alan Rew |
Mar 29, 2012 |
Aug 29, 2014 |
Printed |
Page 499
Example 18-2 |
Comment is "If the request was compete and successful". Should read "If the request was complete and successful".
|
Ken Wilson |
Aug 03, 2011 |
Aug 29, 2014 |
Printed, PDF |
Page 501
last paragraph, penultimate line |
The text refers to the non-existent XMLHttpRequest method setOverrideMimeType(), instead of overrideMimeType(), which is probably what is intended.
Note from the Author or Editor: Change setOverrideMimeType() to overrideMimeType()
|
Alan Rew |
Apr 06, 2012 |
Aug 29, 2014 |
|
501
Example 18-3 |
Comment "If the request was compete and successful" should be "If the request was complete and successful".
|
O'Reilly Media |
Jan 22, 2013 |
Aug 29, 2014 |
Printed |
Page 502
Example 18-4 |
Page 503; Example 18-5, first paragraph following:
"HTML forms generate POST requests by default."
Is that true? Perhaps XMLHTTPRequest does, but do
HTML forms default to POST?
Page 502 and 503: Example 18-4: encodeFormData() function.
I believe there are other locations where this procedure
is used (decoding data, etc.).
The code indicates that to *encode* data, first replace spaces with "+"
then encodeURIComponent. To *decode* submitted data, first
decodeURIComponent and then replace "+" with space (I am *sure* I saw
that decoding somewhere, using 'unescape' - but it seems to be wrong).
Done that way, spaces and "+"s in the original text are mixed and
cannot be unmixed.
encodeURIComponent appears *not* to act precisely the way a form
submission acts in encoding items. In submission of a real form
on an HTML page, submitted data first has "+"s encoded (HEXed/escaped)
but SPACES ARE LEFT ALONE (not escaped). After that step (escaping)
spaces are converted to "+" as the final encoding step. Apparently
this is a hold over from old formats when only plain text (no "+"s!)
with spaces was expected (if that is the case, then just convert
spaces to + to send it without problems and there is no mixing of
"+" and space as the original text had no "+"s). That is the data
(first escape some characters, including "+" but EXCLUDING spaces,
and then change spaces to "+").
I guess, if done now, both "+" and spaces would simply be escaped.
On the other hand, encodeURIComponent seems to escape both spaces
AND "+" - a bit different from www-form encoding (in which case
don't do any of the space/+ conversions in creating data, there
won't be any problem or spaces or "+" after endodeURIComponent).
Hopefully servers will handle decoding of submitted data (they
will try first to convert "+" to space, but find none, and then
unescape the result ... and it comes out right). On the other hand,
I am sure there is code in 'Javascript, The Definitive Guide" for
DECODING responses and if the response is sent back 'www-form-encoded'
one has to decode it properly (first change "+" to space and *then*
unescape which will recover any "+"s in the original data).
Note from the Author or Editor: In the first block of code on page 503, change these lines:
name = encodeURIComponent(name.replace(" ", "+")); // Encode name
value = encodeURIComponent(value.replace(" ", "+")); // Encode value
To:
name = encodeURIComponent(name).replace("%20", "+"); // Encode name
value = encodeURIComponent(value).replace("%20", "+"); // Encode value
In the last paragraph of page 503, cut the lines:
HTML forms generate POST requests by default, but they can also make
GET requests. (When the purpose...than POST.)
And replace them with these:
Form data can also be submitted using a GET request, and when the
purpose of a form submission is to make a read-only query, GET is
more appropriate than POST.
|
Anonymous |
Jul 11, 2011 |
Aug 12, 2011 |
ePub |
Page 507
Fifth paragraph |
The text "clear Interval()" has an extra space and should be "clearInterval()", in the following text:
"passed to clear Interval() to cancel any future invocations"
Note from the Author or Editor: Space removed as per detailed description.
|
radomire |
Apr 11, 2013 |
Aug 29, 2014 |
Printed |
Page 508
First line |
The word 'to' should be inserted between the words 'object' and 'register'. i.e. the sentence should read
"You can call the addEventListener() method of the XMLHttpRequest object to register handlers..."
Note from the Author or Editor: Add "to" so that phrase reads "...of the XMLHttpRequest object to register handlers..."
|
Alan Rew |
Mar 29, 2012 |
Aug 29, 2014 |
Printed |
Page 515
above "appendChild(script)" in the code |
It could be worth noting, as a comment in the JavaScript code, that the line appending the script node should be preceded by setAttribute('type', 'text/javascript') when the the JavaScript code is to be used together with XHTML code.
Note from the Author or Editor: Added this comment:
// If you use the JavaScript code together with XHTML, add
// script.setAttribute('type', 'text/javascript');
|
Saašha Metsärantala |
Dec 29, 2011 |
Aug 29, 2014 |
Printed |
Page 554
1st paragraph |
As is stated in the penultimate para of the same page, the font-size property name should be quoted, ie
"font-size": 10
instead of
font-size: 10
Note from the Author or Editor: Change as described in error:
"font-size": 10
|
timhuckvale |
Mar 13, 2012 |
Aug 29, 2014 |
Printed |
Page 559
Code sample before last paragraph |
The code sample at the end of page 559 is written as:
$('#temp').load("us_weather_report.html", {zipcode:02134, units: 'F'});
This will not achieve the proper effect (and will be rejected in strict mode), because the zip code has a leading 0 and will be converted to octal in most implementations - as page 32 states, "you should never write an integer literal with a leading zero". The zip code should be enclosed in quotation marks:
$('#temp').load("us_weather_report.html", {zipcode:'02134', units: 'F'});
Note from the Author or Editor: Enclose occurrences of 02134 in single quotes, as in detailed description.
|
Joshua Davies |
Feb 04, 2014 |
Aug 29, 2014 |
Printed |
Page 562
first example |
this.disabled = "disabled"
should be
this.disabled = true
or
this.setAttribute("disabled", "disabled")
Note from the Author or Editor: The reporter is correct. Please change this line to:
this.disabled = true;
|
Anonymous |
Nov 03, 2012 |
Aug 29, 2014 |
Printed |
Page 577
middle of page, following first actual paragraph |
In the example:
p:nth-child(3n+1):text(JavaScript):not(:has(a))
shouldn't "text" be "contains"? "text" searches for [type="text"] while "contains" searches for its textual argument.
Note from the Author or Editor: Replace
p:nth-child(3n+1):text(JavaScript):not(:has(a))
with:
p:nth-child(3n+1):contains(JavaScript):not(:has(a))
|
James Finn |
May 03, 2012 |
Aug 29, 2014 |
Printed |
Page 600
2nd line |
Second line says "memory.setAtttribute". It should be "memory.setAttribute", with only two t's.
Note from the Author or Editor: Change as per description; memory.setAtttribute becomes memory.setAttribute
|
Domen |
Mar 11, 2012 |
Aug 29, 2014 |
PDF |
Page 641
1st paragraph |
The description of the function rotateAbout should be counterclockwise, not clockwise. We can write a code fragment to validate it, for example:
<canvas id="my_canvas_id" width=1000 height=1000></canvas>
<script>
var canvas = $('#my_canvas_id')[0];
var c = canvas.getContext('2d');
function rotateAbout(c, theta, x, y) {
var ct = Math.cos(theta), st = Math.sin(theta);
c.transform(ct, -st, st, ct, -x*ct-y*st+x, x*st-y*ct+y);
/* equal to
c.translate(x, y);
c.rotate(theta);
c.translate(-x, -y);
*/
}
rotateAbout(c, Math.PI, 500, 500);
c.beginPath();
c.moveTo(300, 300);
c.lineTo(200, 200);
c.lineTo(100, 200);
c.stroke();
</script>
original paragraph:
// Rotate theta radians clockwise around the point (x,y)
// This can also be accomplished with a translate,rotate,translate sequence function rotateAbout(c,theta,x,y) {
var ct = Math.cos(theta), st = Math.sin(theta);
c.transform(ct, -st, st, ct, -x*ct-y*st+x, x*st-y*ct+y); }
Note from the Author or Editor: Change comment to read "counterclockwise" as per detailed description.
|
Pang Luo |
Nov 18, 2013 |
Aug 29, 2014 |
Printed |
Page 670
second to last line on the page |
The next to last line reads:
elt.innerHTMl = "Geolocation not supported in this browser";
It should read:
elt.innerHTML = "Geolocation not supported in this browser";
(The 'L' in "HTML" should be capitalized).
Note from the Author or Editor: As per description, change innerHTMl to innerHTML
|
Joshua Davies |
Feb 14, 2014 |
Aug 29, 2014 |
Printed |
Page 674
starting comments in the code for 'display(state)' |
...
// initial state, in that case we would overwrite the acutal[SIC] historical
(acutal -> actual)
and ... (as an aside)
'is different from' differs from 'is different than.'
Note from the Author or Editor: yes, fix the typo
|
Anonymous |
Jul 16, 2011 |
Aug 12, 2011 |
Printed |
Page 689
3rd code block |
the line:
var last3 = ints.subaaray(ints.length-3, ints.length); // Last 3 of them
should read:
var last3 = ints.subaray(ints.length-3, ints.length); // Last 3 of them
Note from the Author or Editor: Change subaarray to subarray
|
Anonymous |
Jan 18, 2012 |
Aug 29, 2014 |
Printed |
Page 700
10th line of first example |
In the 10th line of example there is comma missing after } (after third parameter of requestFileSystem).
Note from the Author or Editor: Change these two lines:
// Use fs here
}
To add a comma after the brace:
// Use fs here
},
|
Anonymous |
Jul 06, 2011 |
Aug 12, 2011 |
PDF |
Page 725
last part, Synopsis of Array.filter() |
array.map(predicate)
array.map(predicate, o)
should be
array.filter(predicate)
array.filter(predicate, o)
Note from the Author or Editor: Change as per detailed description.
|
Shoko Shikano |
Sep 25, 2011 |
Aug 29, 2014 |
PDF |
Page 736
Examples for Array.some() |
The comment on this example does not seem to match the code:
[1,2,3].some(function(x) { return x > 2; }) // => true: some elts are > 3
I think the last digit in the comment should be changed thus:
[1,2,3].some(function(x) { return x > 2; }) // => true: some elts are > 2
(This is a darn good book, otherwise)
Note from the Author or Editor: Change as per description of error; comment should read "some elts are > 2"
|
Bruce Wisentaner |
Mar 05, 2013 |
Aug 29, 2014 |
Printed |
Page 738
Example |
The examples of array.splice() give false return results. It should be:
var a= [1,2,3,4,5,6,7,8];
a.splice(1,2); // Returns [2,3]; a is [1,4,5,6,7,8]
a.splice(1,1); // Returns [4]; a is 1,5,6,7,8]
a.splice(1,0,2,3) //Returns []; a= 1,2,3,5,6,7,8
Note from the Author or Editor: Add this as the first example:
a.splice(4); // Returns [5,6,7,8]; a is [1,2,3,4]
Then all the subsequent examples are correct.
|
Anonymous |
Nov 07, 2011 |
Aug 29, 2014 |
Printed, PDF |
Page 787
sample JSON.parse() code after 4th paragraph |
The code sample starts with the line
var data JSON.parse(text, function(name, value) {
There should be an equals '=' sign between 'data' and 'JSON', i.e.
var data = JSON.parse(text, function(name, value) {
Note from the Author or Editor: Change as per description; add an equal sign after "data"
|
Alan Rew |
Apr 04, 2012 |
Aug 29, 2014 |
Printed |
Page 802
last code sample of the Number entry |
The last code sample for Number reads:
var value = 1234;
var binary_value = n.toString(2);
"n" is not defined in this example; assuming that it's meant to be a demonstration of the "toString" function, it should read:
var value = 1234;
var binary_value = value.toString(2);
instead.
Note from the Author or Editor: Make change as per description; change from
var binary_value = n.toString(2);
to
var binary_value = value.toString(2);
|
Joshua Davies |
Feb 25, 2014 |
Aug 29, 2014 |
PDF |
Page 814
Part 3, Core JavaScript Reference, 2nd paragraph in Description part of Object.defineProperty() |
The last sentence says that the default attribute values of absent members are false or null, but ECMAScript language defines them false or "undefined", not null. This definition is shown as Table-7 on ECMA-262 edition 5.1, within the Object Type section (8.6.1 actually).
Note from the Author or Editor: Change "false or null" to "false or undefined"
|
a-shouko |
Jul 20, 2011 |
Aug 12, 2011 |
Printed |
Page 845
4th line |
Text to the left of the matched substring is $`, not $'.
Note from the Author or Editor: Change first column in the row with "The text to the left of the matched substring" to $`
|
James Finn |
May 21, 2012 |
Aug 29, 2014 |
, Printed |
Page 876
3rd paragraph of "fillText" entry |
In the sentence starting "If the textBaseline is 'center' . . . " should read "If the textBaseline is 'middle' . . . " . Page 873 says that there is no 'center' as a legal value of textBaseline.
Note from the Author or Editor: Change "center" to "middle" as per description of error.
|
Thomas Giammo |
Jul 20, 2013 |
Aug 29, 2014 |
Printed |
Page 880
Last text paragraph on the page |
The last sentence of the summary for ClientRect reads:
ClientRect objects are x static:
The 'x' appears to be a typo (if not, it isn't explained).
Note from the Author or Editor: Change "x static" to "static" (delete the "x")
|
Joshua Davies |
Mar 04, 2014 |
Aug 29, 2014 |
Printed, PDF |
Page 898
last paragraph in 'DocumentFragment' |
The API name querySelectorAll() has 2 spaces inserted into its name, i.e. written as 'query selector All()'.
Might be due to spell-checker auto-correct being used unguardedly, which can be hazardous in a technical book.
Note from the Author or Editor: Remove spaces in querySelectorAll() as per description.
|
Alan Rew |
May 10, 2012 |
Aug 29, 2014 |
Printed |
Page 898
Last paragraph in the entry for Document |
The last sentence of the last paragraph ends with:
since there is an onDOMContentLoaded property
This sentence should read:
since there is no onDOMContentLoaded property
Note from the Author or Editor: "there is an onDOMContentLoaded property" should be changed to "there is no onDOMContentLoaded property" as described in error.
|
Joshua Davies |
Mar 05, 2014 |
Aug 29, 2014 |
Printed |
Page 922
explanation of dispatchEvent(Event event) |
At least in 'WebKit' you need to call
document.createEvent('Events')
to create a simple event object (the book states that document.createEvent('event') will do).
Note from the Author or Editor: Please fix.
|
Axel Schreiner |
Aug 06, 2011 |
Aug 12, 2011 |
Printed |
Page 938
Last Paragraph |
On the methods of HTMLOptionsCollection, there is the "add" method.
It says that the second parameter is optional. This is not true in all browsers. In FireFox (tested on 3.6.18, 4.0 and 5.0.1), the 2nd argument is REQUIRED. You must pass null if you want to add at the end.
Here is the message that Firefox shows:
Error: uncaught exception: [Exception... "Not enough arguments" nsresult: "0x80570001 (NS_ERROR_XPC_NOT_ENOUGH_ARGS)" location: "..." data: no]
The same problem happens on page 987, on the add method.
If the specs/RFC (if any) define that the 2nd parameter is indeed optional, there should be a note on the book saying that Firefox is buggy. If the specs/RFC define that the 2nd parameter is mandatory, the book should be corrected.
Thanks,
Claudio Neves
Note from the Author or Editor: Add text at end of paragraph: In some older browsers such as Firefox 5.0.1, the second argument is required.
|
Claudio Neves |
Aug 04, 2011 |
Aug 29, 2014 |
Other Digital Version |
943
Description of min property of Input |
The min property is described as "A maximum valid value for this Input element." This should probably say "A minimum valid ..."
Note from the Author or Editor: Make change as in description of error:
"A maximum valid value for this input. element." should become
"A minimum valid value for this input. element.
|
Evan |
Dec 15, 2011 |
Aug 29, 2014 |
PDF |
Page 964
"Properties" list, items 2 & 3 |
The examples given for the "host" and "hostname" location properties erroneously include the URI schema (erroneously referred to as the "protocol" by JavaScript). The hostname property includes only of the name, domain-name and top-level domain of the host. The host includes the hostname and port number (if other than the default for the protocol indicated by the scheme).
So...
"http://www.oreilly.com:1234" should be "www.oreilly.com:1234"
and
"http://www.oreilly.com" should be "www.oreilly.com"
Note from the Author or Editor: Change as per description:
"http://www.oreilly.com:1234" should be "www.oreilly.com:1234"
and
"http://www.oreilly.com" should be "www.oreilly.com"
|
Dave Livesay |
Feb 28, 2013 |
Aug 29, 2014 |
Printed |
Page 983
First sentence on page |
The first sentence reads:
When the amount of work or time required to complete the task is not know,
It should read:
When the amount of work or time required to complete the task is not known,
Note from the Author or Editor: Change "know" to "known"
|
Joshua Davies |
Mar 20, 2014 |
Aug 29, 2014 |
Printed, PDF |
Page 1018
1st paragraph, line 4 |
The onreadystatechange property is printed with an embedded space:
onready statechange
Note from the Author or Editor: Blanks removed from source.
|
Alan Rew |
Apr 05, 2012 |
Aug 29, 2014 |
Printed, PDF |
Page 1021
left column, line 13. |
// and /? */ in comments, 23
should read
// and /* */ in comments, 23
Note from the Author or Editor: Please fix.
|
Mingway Huang |
Jul 31, 2011 |
Aug 12, 2011 |
Printed, PDF |
Page 1026
right column, line 2 from the bottom |
"till or stroke using, 647"
should read:
"fill or stroke using, 647"
Note from the Author or Editor: Please fix it.
|
Mingway Huang |
Aug 01, 2011 |
Aug 12, 2011 |
Printed, PDF |
Page 1061
index entry for __proto__ |
The index entry for __proto__ is wrong, out by 1 page.
Reads 136
Should be 135
|
Alan Rew |
May 10, 2012 |
Aug 29, 2014 |
Other Digital Version |
2018
The page number above is the location number of Kindle edition |
In the fuction "hide", a semicolon is missing in the following line:
e.style.display = "non" // hide element and use its space
Note from the Author or Editor: Line should read:
e.style.display = "non"; // hide element and use its space
|
Yoshiki Shibata |
Feb 04, 2013 |
Aug 29, 2014 |