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 |
Other Digital Version |
Errata
Page 191 3rd para, 1st sentence |
Meta-erratum: On the errata page, "rather that" should be "rather than" in this correction:
"Functions defined as expressions (rather that with a declaration) are not hoisted…"
|
Mike Morrison |
Apr 16, 2021 |
|
Printed |
Page xiv
Near top |
After "Constant width bold", the following line has no period at the end, unlike the similar explanatory lines that precede it on the same and previous page:
"Shows commands or other text that should be typed literally by the user"
Suggested fix: Add period.
|
Mike Morrison |
Apr 18, 2021 |
|
|
---
section 6.2.3, 6.3.2, chapter 9 |
I had a pretty hard time understanding inheritance in Javascript, and I think the central problem was that prototypes are not associated with objects just via property access (i.e. o.prototype), but in some internal manner that is only accessible via Object.getPrototypeOf(o) or (apparently non-standardized but de facto available in most JS environments) via o.__proto__. This seems to me like a crucial piece of information that should be mentioned early on, i.e. that the prototype assigned to an object is not the same as its property o.prototype, that changing that property of the object does not change its prototype, and that there are significant internals that represent the prototype chain that aren't very visible and keep the chain from being changed by simple property assignment. I haven't gotten to chapter 14 yet, but a cursory glance at 14.3 tells me that those issues are probably being discussed there; if that's the case, then a forward reference at each of the relevant places with a short clarification that o.prototype is NOT the prototype assigned to an object and that there's some other mechanism to handle that association would have helped at least me quite a lot.
There are also two TODOs left in the book, and a good number of editorial errors (mostly small grammatical errors); it's possible those are a matter of the book not being quite finished yet.
|
Georg Bachmeier |
Apr 25, 2020 |
May 13, 2020 |
|
Page 3.2.3
3.2.3 Arithmetic in JavaScript - 3rd code listing |
"Number.EPSILON // => 2**-52: smallest difference between numbers"
Number.EPSILON is described as the "smallest difference between numbers" but in fact, it is the difference between 1 and the smallest value greater than 1 that is representable as a Number value.
There are smaller differences between numbers for example in the range from 0 to 1
Note from the Author or Editor: Thanks for this clarification. That makes a lot more sense than what I wrote.
Please change:
// => 2**-52: smallest difference between numbers
To:
// Difference between 1.0 and the next-larger Number
|
Paweł Gawlas |
Jul 27, 2021 |
|
|
10.2.1
Node exports |
I think 'exports' is not a constant, since you can overwrite it.
exports = "dog";
console.log(exports);
It originally seems to be a non-constant reference to 'module.exports';
'module.exports' is what you are interested in, so don't break the reference.
|
Jukka Pietarinen |
May 02, 2020 |
May 13, 2020 |
Printed |
Page 27
1 line of 3.2.3 |
Error in the errata
The errata for page 37 mentions that section 3.2.3 is on page 37 but it's on page 27.
Note from the Author or Editor: (how meta!)
|
michel thibert |
Sep 23, 2020 |
|
Printed |
Page 31
4th line of page |
In the 4th line, the final "y" in the word "they" is missing. The line begins with:
default, the are in base 10, but you can use the .....
And it should say:
default, they are in base 10, ...
|
Oscar Fernandez Sierra |
Sep 17, 2020 |
|
Printed |
Page 34
Sixth line of the last paragraph (before table 3-1) |
The line says:
Unicode character specified by four hexadecimal digits or one to five digits when the
The right value is "six", not "five", as you can check in the last line of table 3-1: the highest codepoint is 10FFFF, that needs six digits. So it should say:
... one to SIX digits ...
Note from the Author or Editor: Change "one to five digits" to "one to six digits"
|
Oscar Fernandez Sierra |
Sep 17, 2020 |
|
Printed |
Page 37
First line of 3.2.3 Arithmetic in Javascript |
The line says:
JavaScript programs word with numbers using the arithmetic operators . that the language provides.
The "." between "operators" and "that" should be removed.
Note from the Author or Editor: Please remove the stray period in the first line of section 3.2.3 "Arithmetic in JavaScript"
|
Oscar Fernandez Sierra |
Sep 17, 2020 |
|
Printed |
Page 41
7th line from bottom of page |
The line reads:
... and iterable objects (chapter 12), it needed to define standard method that classes ....
The article 'a' is missing before 'standard'.
Note from the Author or Editor: Please change "it needed to define standard method" to read "it needed to define a standard method"
|
Frans Jaspers |
Oct 12, 2020 |
|
Printed |
Page 43
Section 3.8, 1st paragraph |
"There is a fundamental difference in JavaScript between primitive values (undefined, null, booleans, numbers, and strings) and objects..."
The list of primitive values looks like it's intended to be exhaustive in which case symbol values are missing.
Note from the Author or Editor: Please change "numbers, and strings)" to "numbers, strings, and symbols)"
|
Brian Chhun |
Apr 19, 2021 |
|
Printed |
Page 47
3rd paragraph, 1st sentence |
Maybe "constructor" should be "constructors" (plural) in this sentence:
"As an aside, note that the Boolean(), Number(), and String() functions can also be invoked—with new—as constructor.
Note from the Author or Editor: Change "as constructor" to "as constructors"
|
Mike Morrison |
Apr 20, 2021 |
|
|
Page 51
Final code example |
The code example displays a different output than what I experience when running this example under Chrome.
Original code follows:
let d = new Date(2010, 0, 1);
d.valueOf();
The book suggests the output of valueOf should be: 1262332800000
The output I obtained was: 1262264400000
I am unsure if this is due to a localisation issue of some type?
Note from the Author or Editor: This is a timezone issue. The Date() constructor creates a date in local time, and you and I are in different timezones. Sorry for the confusion.
Please change:
// => 1262332800000
To:
// => 1262332800000; (timezone-dependent)
|
Michael Hiatt |
Jun 16, 2021 |
|
Printed |
Page 57
Sidebar - 1st paragraph |
"It will be a global now deeply nested..." --> "It will be a global how deeply nested..."
now --> how
Note from the Author or Editor: In the "Using Undeclared Variables" sidebar please change "no matter now deeply" to "no matter how deeply"
|
Prabath Siriwardena |
Sep 14, 2020 |
|
PDF |
Page 75
2nd para. |
"The JavaScript number format allows you to exactly represent all
integers between −9,007,199,254,740,992 (−2^53 ) and
9,007,199,254,740,992 (2^53 ), inclusive. If you use integer values larger
than this, you may lose precision in the trailing digits."
Of course this should be:
−9,007,199,254,740,991 (−2^53-1 ) and 9,007,199,254,740,991(2^53-1)
as made clear by the words 'inclusive' i.e. closed interval.and 'larger'.
Error confirmed on pg. 81 by correct values of Number.MIN_SAFE_INTEGER and Number.MAX_SAFE_INTEGER
and isSafeInteger definition.
Note from the Author or Editor: This change to the numbers should be applied on page 25 of the printed book, not on page 75
|
Anonymous |
Apr 10, 2021 |
|
Printed |
Page 78
3rd paragraph, last sentence |
The word "and" seems superfluous in this sentence:
7 >> 1 evaluates to 3, for example, but note that and -7 >> 1 evaluates to -4.
Note from the Author or Editor: Change "but not that and" to "but note that"
|
Mike Morrison |
Apr 21, 2021 |
|
Printed |
Page 89
4.12.1, 1st paragraph, last sentence |
"propogates" should be "propagates"
|
Mike Morrison |
Apr 21, 2021 |
|
Printed |
Page 95
first sentence of 4.13.7 |
The text has the word "comma" in monospace code font here:
"The comma operator is a binary operator..."
I wonder if the word "comma" should instead be set in normal text font, or maybe replaced with a literal comma character (",") in code font, for consistency with the descriptions of the other operators and to avoid implying that the word "comma" itself is a reserved word.
Note from the Author or Editor: Set "comma" in roman not code font.
|
Mike Morrison |
Apr 21, 2021 |
|
|
100
Second sentence |
There is an error in the description of the Set Class in 11.1.1
"A set is a collection of values, like an array is. Unlike arrays, however, sets are not ordered or indexed"
Actually, a JavaScript Set object keeps insertion order.
Note from the Author or Editor: The iteration order of sets is explained at the end of the section, but the reporter is correct here that it is misleading to call them "not ordered" at the start of the section.
On page 268, in the 2nd sentence of 11.1.1, please change "sets are not ordered or indexed" to "sets are not indexed"
|
Anonymous |
Oct 20, 2020 |
|
Printed |
Page 108
Last sentence |
"As with all loops, the body of a for/of loop follows the parentheses..."
do/while loops are an exception to the "all loops" part of this statement.
Note from the Author or Editor: Change "As with all loops, the" to "The"
|
Mike Morrison |
Apr 21, 2021 |
|
Printed, |
Page 113
1st paragraph |
Where read:
"... The throw statement is a kind of interim return from a generator function. "
should be read:
"... The yield statement is a kind of interim return from a generator function. "
Note from the Author or Editor: Thanks for pointing out this particularly dumb typo. You are correct that the sentence should read "The yield statement is a kind of interim return from a generator function". The very next sentence also begins "The throw statement" and that one is correct as it stands.
|
Alfred Myers |
Aug 18, 2020 |
|
Printed |
Page 118
1st paragraph, 3rd sentence |
"If the block...does not have an associated catch clause, the interpreter checks the next-highest enclosing block..."
I feel like "next-highest" should be "next higher", since the directional metaphor in this paragraph is of exceptions propagating upward to higher levels. "Next-highest" seems to indicate stepping downward from the highest level.
Note from the Author or Editor: Please delete "next-highest". The sentence is clear without it.
|
Mike Morrison |
Apr 21, 2021 |
|
Printed |
Page 123
Last bullet point |
"In strict mode, it is a syntax error for an object literal to define two or more properties by the same name."
Is this still the case? MDN seems to say the behavior has been changed:
"In ECMAScript 5 strict mode code, duplicate property names were considered a SyntaxError. With the introduction of computed property names making duplication possible at runtime, ECMAScript 2015 has removed this restriction."
'use strict';
var o = { p: 1, p: 2 }; // syntax error prior to ECMAScript 2015
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#duplicate_property_names
and
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
Note from the Author or Editor: In the last bullet of page 123, change "In strict mode" to "In ES5 strict mode" and at the end of the sentence change "(In non-strict mode, no error occurs)" to "(In non-strict mode, and in ES6 strict mode, no error occurs)"
|
Mike Morrison |
Apr 21, 2021 |
|
Printed |
Page 124
2nd bullet point |
The first sentence refers to an octal literal with a '0' not followed by an 'x' but this in fact describes a hexadecimal literal. Instead, it should read:
"beginning with a 0 that is not followed by an o".
Note from the Author or Editor: Thanks for pointing this out. That text dates to the days before JavaScript explicitly supported the '0o' notation.
Please change the parenthetical text "(beginning with a 0 that is not followed by an x)" to "(integers beginning with a 0 that is not followed by a b, o, or x)"
|
James Maher |
Sep 10, 2020 |
|
Printed |
Page 126
5.7.4, 1st paragraph, 3rd sentence |
Maybe add "a", changing:
(such as function or class)
to:
(such as a function or class)
Note from the Author or Editor: change "such as function" to "such as a function"
|
Mike Morrison |
Apr 22, 2021 |
|
Printed |
Page 138
3rd bullet point, 2nd sentence |
Maybe remove "and" from this sentence:
"Since p does not already exist in o, and if there is no setter method to call, then p must be added to o."
Note from the Author or Editor: Change "and if there is no setter method" to "and since there is no setter method"
|
Mike Morrison |
Apr 23, 2021 |
|
Printed |
Page 155
end of 1st paragraph |
"For sparse arrays, length is larger than the highest index of any element."
This sentence seems to imply a difference with nonsparse arrays, however it is true of both.
Note from the Author or Editor: Please change the final sentence of that paragraph so that it reads:
For sparse arrays, length is larger than the highest index of any element (but it does not tell us anything about the number of elements).
|
James Batman |
Oct 19, 2020 |
|
Printed, PDF |
Page 158
Section 7.1.5., first para |
Original: Array.from is another array factory method introduced in ES6.
Issue: Missing parantheses after Array.from()?
Possible fix: Add parentheses. ;)
Note from the Author or Editor: Please add parentheses, changing "Array.from" to "Array.from()"
|
Jørgen Lang |
Sep 18, 2020 |
|
Printed, PDF |
Page 166
2nd para, 1st sentence |
Original: "Each of these functions…"
Issue: talking about iterator *methods*
Suggested fix: Change 'functions' to 'methods' for clarity.
Note from the Author or Editor: At the start of the last paragraph of section 7.8.1 change "Each of these functions" to "Each of these methods".
|
Jørgen Lang |
Sep 18, 2020 |
|
Printed, PDF |
Page 167
1st para |
Original: "The function you pass to it should be predicate: a func‐ tion that returns true or false. "
Issue: In the section about find() and findIndex() it is said "...your predicate function returns a truthy value...". Both statements seem to mildly contradict each other. Boolean true/false is stricter than truthy/falsy.
Question: Which one should it be?
Note from the Author or Editor: Thanks for pointing this out. You're correct that I've been inconsistent in my description of the return values of predicate functions on page 167 in the sections on "filter()", "find() and findIndex()" and "every() and some()".
I think the best way to fix this throughout without getting too tedious is to change the second sentence of the first paragraph of the "filter()" section so that it reads:
"The function you pass to it should be a _predicate_: a function whose return value will be interpreted as a truthy or falsy value."
Please set the word "predicate" in italics since this is the first time it is used and this is a definition.
|
Jørgen Lang |
Sep 18, 2020 |
|
Printed |
Page 168
Third line of second paragraph (not counting the block of Javascript code) |
In the third line of second paragraph, instead of showing "true" in monospaced font, appears <code>true></code>. That line says:
<code>true></code> and only interates through the entire array if your predicate always
instead of
true and only interates through the entire array if your predicate always
Note from the Author or Editor: Please change <code>true</code> to "true" in code font.
Looks like maybe the manual process of fixing bad line breaks went awry here?
|
Oscar Fernandez Sierra |
Nov 10, 2020 |
|
Printed |
Page 168
Block of code after first paragraph |
In the second line of the first block of code, after the first paragraph, there is a line o f code that says:
a.some(x => x%2===0)
To use a good formatting style and to have a homogeneus style with a similar example (with the same predicate function) in the previos page, it should appear with a space before and after operators "%" and "===":
a.some(x => x % 2 === 0)
Note from the Author or Editor: Please add the spaces that the reporter describes.
And then on the next line, add some spaces before the comment so that the comments are aligned.
|
Oscar Fernandez Sierra |
Nov 10, 2020 |
|
Printed |
Page 168
2nd paragraph, last sentence |
"Note also that, by mathematical convention, every() returns true and some returns false when invoked on an empty array."
Maybe add parentheses, changing "some" to "some()" in this sentence, for consistency with the other mentions of every() and some() in this section.
Note from the Author or Editor: Change "some" to "some()" and ensure that it remains in code font.
|
Mike Morrison |
Apr 23, 2021 |
|
Printed, PDF |
Page 177
last para, 1st bullet point |
Original: "The length property is automatically updated as new elements are added to the list"
Question: 'list' or 'array'?
Note from the Author or Editor: Please change the first bullet of section 7.9 "Array-like Objects" to end the sentence after "added", deleting "to the list."
|
Jørgen Lang |
Sep 18, 2020 |
|
Printed, PDF |
Page 184
3rd para, 1st sentence |
Original: "A name is allowed for functions, like the factorial function,"
Issue: Section refers to function expressions
Question: Did you mean, "A name is allowed for function expressions, like the factorial function,"?
Note from the Author or Editor: Please clarify this text by changing:
"A name is allowed for functions, like the factorial function, that"
to:
"A name is allowed for function expressions, like the factorial function above, that"
|
Jørgen Lang |
Oct 02, 2020 |
|
Printed |
Page 184
Last paragraph, 3rd sentence |
"expression that defines" should be "expressions that define" in this sentence:
"This is not true for functions defined as expressions, however: these functions do not exist until the expression that defines them are actually evaluated."
|
Mike Morrison |
Apr 23, 2021 |
|
Printed, PDF |
Page 186
2nd para, 1st sentence |
Original: "…they inherit the value of the this keyword from the environment in which they are defined…"
Question: Are "environment" and "scope" used as synonyms?
Note from the Author or Editor: I wasn't intending to use "environment" in any kind of technical sense. Scope would be a better word here.
Let's change "from the environment in which they are defined" to "from the scope in which they are defined"
|
Jørgen Lang |
Sep 22, 2020 |
|
Printed, PDF |
Page 191
multiple |
Original:
1st para, 1st sentence: "Inside the nested function f(), the this keyword is not equal to the object o. "
3rd para, 1st sentence: "…so in order to make this code work, the function definition for f will need to…"
Issue: Apparently inconsistent use of parentheses on function names. This happens on a few (but not many) occasions in the book.
Suggested fix: Add parentheses to function names where missing: f().
Note from the Author or Editor: These paragraphs at the end of 8.2.2 discuss an object o, a method m and a function f. It is clearer if we just use single letters for f and m, so let's remove the parentheses in "Inside the nested function f()" and just write "Inside the nested function f"
|
Jørgen Lang |
Sep 22, 2020 |
|
Printed, PDF |
Page 191
3rd para, 1st sentence |
Original: "Functions defined as expressions instead of statements are not hoisted…"
Question: Shouldn't this be "declarations" instead of "statements"?
Note from the Author or Editor: Yes, please change:
"Functions defined as expressions instead of statements are not hoisted…"
To:
"Functions defined as expressions (rather that with a declaration) are not hoisted…"
|
Jørgen Lang |
Nov 21, 2020 |
|
|
Page 195
Code example at the bottom of page 195 |
The max() function includes one parameter which is the parameter x. This example also works without any parameters as we are iterating through the arguments array-like object.
My question is, is there a reason that the parameter x has been included in the code example?
Note from the Author or Editor: I don't actually remember why I defined the x parameter there. Perhaps to indicate that at least one argument is expected. You're right to ask about this, though. This seems more confusing than useful.
Please change "function max(x) {" at the bottom of page 195 to "function max() {"
|
Emrah Abdurahman |
Dec 17, 2021 |
|
Printed, PDF |
Page 196
ch8, 4th para, last sentence |
Original: "Rest parameters and the spread operator are often useful together, as in the following function, which takes a function argument and returns an instrumented version of the function for testing:"
Issue: This is the only time the term "instrumented" is used in the book. Term has not been introduced.
Quesion: Does it make sense to give a short description of the concept of instrumentation?
Note from the Author or Editor: That is a good point. The concept of instrumentation is illustrated by the code, so let's not define it here. Instead just replace "instrumented" with "wrapped", which is the term I used in the code comments, anyway.
|
Jørgen Lang |
Oct 05, 2020 |
|
Printed, PDF |
Page 196
8.3.4, 3rd para, last sentence |
Original: "Rest parameters and the spread operator are often useful together, as in the following function, which takes a function argument and returns an instrumented version of the function for testing:"
Question: What is meant by "instrumented". The term is only used in this location in the book.
Note from the Author or Editor: I'm using the word "instrumented" here to mean "modified to log timing information".
It is a nice, specific word. But the paragraph might be clearer if we change "...returns an instrumented version of the function for testing:" to "...returns a new function that wraps the original and adds a log message to report how long the original took to execute:"
|
Jørgen Lang |
Nov 21, 2020 |
|
Printed |
Page 200
1st code comment line |
Add "of", changing:
// Return the sum of the elements an iterable object a.
to:
// Return the sum of the elements of an iterable object a.
|
Mike Morrison |
Apr 24, 2021 |
|
Printed |
Page 204
Last paragraph of 8.5 Functions as Namespaces |
Appears "namesapce" instead of "namespace"
|
Oscar Fernandez Sierra |
Jun 17, 2020 |
|
Printed, PDF |
Page 217
2nd para, 2nd sentence + 3rd para, 1st sentence |
Original: "Here, for example, is a way to define the preceding not() function just shown using composition and partial application:" and
"We can also use composition and partial application to redo our mean and standard deviation calculations in extreme functional style:"
Issue: The term "composition" has not yet been introduced.
Suggestion: Add a short definition for the term "composition" as used in the book might be helpful although it is not absolutely necessary for the intended audience.
Note from the Author or Editor: Change the sentence:
Here, for example, is a way to define the preceding not() function just shown using composition and partial application:
to:
Here, for example, is a way to define the not() function from the previous section using composition (i.e. the compose() function from the previous section) and partial application:
|
Jørgen Lang |
Sep 22, 2020 |
|
Printed |
Page 218
Code in middle of page, first comment line, last word |
"Euclidian" => "Euclidean"
|
Mike Morrison |
Apr 24, 2021 |
|
Printed, PDF |
Page 226
2nd para, 1st sentence |
Original: Finally, also note the things that do not change between Examples 9-1 and 9-2 : the range methods are defined and invoked in the same way for both classes.
Issue: missing formatting and parentheses for "range".
Suggested fix: Format "range" as [cursive]range()[/cursive].
Note from the Author or Editor: The word "range" is incorrect in this sentence but the suggested fix is incorrect.
Please change "the range methods are defined and invoked in the same way for both classes" to "the methods of both classes are defined and invoked in the same way"
|
Jørgen Lang |
Sep 28, 2020 |
|
Printed |
Page 228
4th line of code |
In the comment "F.prototype.constructor === F for any F", I found "for any F" confusing, since, if I understand correctly, the preceding examples illustrate functions where that equality isn't true, because the prototype property has been overwritten.
Note from the Author or Editor: Please change "for any F" in the comment to "by default"
|
Mike Morrison |
Apr 24, 2021 |
|
Printed |
Page 230
1st bullet point |
Maybe add "the" or "a" between "name of" and "class"
Note from the Author or Editor: Change "the name of class" to "the name of the class"
|
Mike Morrison |
Apr 24, 2021 |
|
Printed, PDF |
Page 232
2nd code example, 2nd line, comment |
Original: // TypeError: r.parse is not a function
Issue: Missing ! before "TypeError"
Note from the Author or Editor: Please change the code comment from:
// TypeError: r.parse is not a function
to:
// !TypeError: r.parse is not a function
(this notation is explained in the box on page 7)
|
Jørgen Lang |
Nov 21, 2020 |
|
Printed, PDF |
Page 239
1st para, 1st sentence |
Original: "In ES6 and later, you can create a superclass simply by adding an extends clause…"
Issue: "extends" creates a subclass (not a superclass), as demonstrated in the following code example.
Suggested fix: replace "superclass" with "subclass"
Note from the Author or Editor: This is an embarrassing one...
In the first line of 9.5.2, please change "superclass" to "subclass"
|
Jørgen Lang |
Sep 28, 2020 |
|
Printed, PDF |
Page 239
2nd para, 2nd last sentence |
Original: Not only are instance methods like pop() inherited, but static methods like Array.isArray are also inherited.
Issue: Missing parentheses after Array.isArray?
Suggested fix: Not only are instance methods like pop() inherited, but static methods like Array.isArray() are also inherited.
|
Jørgen Lang |
Sep 28, 2020 |
|
Printed |
Page 242
9.5.3, 2nd paragraph, 1st sentence |
"added to set" => "added to the set"
|
Mike Morrison |
Apr 25, 2021 |
|
|
Page 242
2nd sentence of code comment at the start of example 9-7 |
Second sentence of the code comments says the following:
"Call add() and remove() like you would for a Set,..."
Issue: I think the author intended to say delete() instead of remove()
Note from the Author or Editor: Please change "Call add() and remove()" to "Call add() and delete()"
|
Emrah Abdurahman |
Dec 27, 2021 |
|
Printed, PDF |
Page 243
code example, 1st comment |
Original: "// The Set-like method has() returns true if the count is non-zero"
Issue: Code tests for '> 0;' so 'non-zero' could be misleading.
Suggested fix: "…returns true if the count is greater than zero"
Note from the Author or Editor: Change:
// The Set-like method has() returns true if the count is non-zero
to:
// The Set-like method has() returns true if the count is greater than zero
|
Jørgen Lang |
Sep 28, 2020 |
|
Printed, PDF |
Page 243
code example, 4th comment |
Original: "…if the count goes back down to zero."
Issue: Comment mentions "zero", but code tests for count === 1.
Question: Shouldn't the code read "count === 0"?
Note from the Author or Editor: The code is correct as it stands. The comment is a little confusing, though.
Please change the comment from:
// the key from the Map if the count goes back down to zero.
to:
// the key from the Map if the count would go back down to zero.
|
Jørgen Lang |
Sep 28, 2020 |
|
Printed, PDF |
Page 245
1st code comment, 1st word |
Original: "Range set is a concrete subclass of AbstractSet."
Issue: Subblass is actually called RangeSet
Suggested fix: Change "Range set" to "RangeSet".
|
Jørgen Lang |
Sep 28, 2020 |
|
Printed, PDF |
Page 245
3rd code comment |
Original: "If the other set is not also Enumerable, it isn't equal to this one"
Issue: Code tests for AbstractEnumerableSet: if (!(set instanceof AbstractEnumerableSet)), but comment says 'Enumerable'.
Suggested fix: Change comment to: ""If the other set is not also an AbstractEnumerableSet, it isn't equal to this one""
Note from the Author or Editor: This comment is misleading as it stands. But using the full AbstractEnumerableSet classname would make it wrap on to a second line. So let's fix it by writing "enumerable" instead of "Enumerable" so that it is clear we're just using an adjective and not refering to a particular class name.
|
Jørgen Lang |
Sep 28, 2020 |
|
Printed |
Page 248
3rd bullet point |
maybe "hood, constructor" => "hood, the constructor"
|
Mike Morrison |
Apr 25, 2021 |
|
Printed |
Page 253
Final line of the third paragraph |
There is no space between module.exports and object. It reads:
"...or by replacing the module.exportsobject entirely."
whereas it should read instead:
"...or by replacing the module.exports object entirely."
Note from the Author or Editor: Please insert the space. (This was a production error caused while fixing a bad line break)
|
James Maher |
Oct 09, 2020 |
|
Printed, PDF |
Page 253
3rd para |
Original: "…by setting properties of the Exports object or by replacing the module.exportsobject entirely."
Issues: (Caveat: I might be completely mistaken here, so please forgive me if I get this wrong. I not much of a Node person.)
1. According to the Node documentation the exports object is written in lowercase. Also it seems as if exports is a variable (not an object), serving as a shortcut/reference for module.exports.
2, Missing space between "module.exports" and "object".
https://nodejs.org/api/modules.html#modules_exports_shortcut
Note from the Author or Editor: 1) In the second to last line before 10.2.1, change "Exports" to "exports" and set "exports" in constant width font.
2) In the last line before 10.2.1, insert the missing space (the space was accidentally deleted during production in order to fix a bad line break)
|
Jørgen Lang |
Oct 09, 2020 |
|
Printed |
Page 255
Last code comment line |
"namspace" => "namespace"
|
Mike Morrison |
Apr 25, 2021 |
|
|
Page 257
Last paragraph of 10.3.1 |
The last sentence of the last paragraph of section 10.3.1 which is in parentheses has a slight grammatical error. The issue is with this part:
"a modules export will be the same on every run..."
Suggested change is:
"a module's export will be the same on every run"
I've added an apostrophe to "module's export" which indicates ownership.
Note from the Author or Editor: In addition to adding the apostrophe, let's also make "exports" plural. Please change "a modules export" to "a module's exports"
|
Emrah Abdurahman |
Jan 02, 2022 |
|
Printed, PDF |
Page 258
1st para, 5th sentence |
Original: "A module specifier string must be an absolute path starting with “/”, or a relative path starting with “./” or “../”, or a complete URL a with protocol and hostname."
Issue: "…a complete URL a with protoco…". Unneccessary 'a' after 'URL'
Suggested fix: Remove 'a' and save it in case someone needs better grades. ;)
Note from the Author or Editor: Please change "complete URL a with" to "complete URL with"
|
Jørgen Lang |
Sep 30, 2020 |
|
Printed, PDF |
Page 258
3rd para, 3rd sentence |
Original: "The exporting module can export any number of named value."
Suggested fix: Add plural 's': "The exporting module can export any number of named values."
|
Jørgen Lang |
Sep 30, 2020 |
|
Printed, PDF |
Page 259
2nd last para, last sentence, just before section 10.3.3 |
Original: "…you can still import the module . just for that default behavior."
Issue: Period in the middle of a sentence.
Suggested fix: "…you can still import the module just for that default behavior."
Note from the Author or Editor: Please remove the spurious period. (Git logs show it was accidentally inserted as part of the index creation process)
|
Jørgen Lang |
Sep 30, 2020 |
|
|
Page 261
3rd line of code on first code block |
The third code line on the first code block incorrectly spells "stddev". This needs to be changed from "export { mean, stdev };" to "export { mean, stddev };"
Note from the Author or Editor: Please change "export { mean, stdev };" to "export { mean, stddev };"
|
Emrah Abdurahman |
Sep 12, 2021 |
|
Printed |
Page 264
10.3.6, 2nd paragraph, 2nd sentence |
"transfered" => "transferred" (to match preceding sentence)
|
Mike Morrison |
Apr 25, 2021 |
|
Printed |
Page 269
1st bullet point |
"used chained" => "use chained"
|
Mike Morrison |
Apr 25, 2021 |
|
Printed |
Page 271
11.1.2, sentence after first code block |
hyphenate "two element" => "two-element"
Note from the Author or Editor: Change "two element" to "two-element"
Also, in the third code comment below this paragraph please change "// Same as new map(" to "// Same as new Map("
|
Mike Morrison |
Apr 25, 2021 |
|
Printed, PDF |
Page 272
line 7 of 1st code example |
Original: // => undefined: this key is not in the set
Issue: It's a map.
Suggested fix: Change comment to "// => undefined: this key is not in the map"
|
Jørgen Lang |
Oct 01, 2020 |
|
Printed |
Page 281
1st full paragraph |
"DataView also defines 10 corresponding Set methods..."
Maybe "Set" should be lowercase and in code font to match "get" in the preceding paragraph.
Note from the Author or Editor: Change "Set" to "set" and put it in code font.
|
Mike Morrison |
Apr 26, 2021 |
|
Printed |
Page 283
First paragraph |
The book states "A number of punctuation characters have special meanings in regular expressions."
Then states the list"^ $ . * and so on.
The list includes "="
"=" is not a special character in RegExp and as far as I know, doesn't need to be escaped. I couldn't find an example where it has to be escaped. If that's true, that character should be omitted from the list.
Note from the Author or Editor: Please remove "=", "!" and ":" from the list of punctuation characters with special meanings near the top of page 283.
They are used in (?:...), (?=...) and (?!...), and although it might sometimes be necessary to escape the ? inside parentheses, it should never be necessary to escape the =, !, or : characters.
|
Camille Lambert |
Oct 29, 2020 |
|
Printed |
Page 285
5th line |
"grammar: it is" => "grammar: each is"
Note from the Author or Editor: Change "it is the name of a category of characters defined" to "they are names of character categories defined"
|
Mike Morrison |
Apr 26, 2021 |
|
Printed, PDF |
Page 289
3rd para (box) 2nd sentence |
Original: In the preceding example, we were able to use a regular expression “backreference” to write a RegExp that would match a single- or double- quoted string where the open and close quotes had to match.
Issue: Example with quotes is previous page 288,
Suggested fix: "On the previous page, we were…" or simply "Earlier, we were…"
Note from the Author or Editor: Please replace "In the preceding example" with "Earlier"
|
Jørgen Lang |
Oct 06, 2020 |
|
Printed |
Page 298
Next to last paragraph, last line |
"matching the any named" => "matching any named"
|
Mike Morrison |
Apr 27, 2021 |
|
Printed, PDF |
Page 301
2nd para, 2nd setence |
Original: If you want to specify a date and time in UTC (Universal Coordinated Time, aka GMT), then you can use the Date.UTC().
Issue: Missing word at end of sentence.
Suggested fix: …then you can use the Date.UTC() method.
Sauce: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC
Note from the Author or Editor: Please remove the word "the", so that "you can use the Date.UTC()" becomes "you can use Date.UTC()"
|
Jørgen Lang |
Oct 15, 2020 |
|
Printed |
Page 306
11.6, first sentence |
"must to convert" => "must convert", and "characters than can" => "characters that can"
|
Mike Morrison |
Apr 27, 2021 |
|
Printed |
Page 310
2nd and 3rd list items |
Maybe the property name 'style' should be in code font in both occurrences of:
'If style is "currency",'
Note from the Author or Editor: Set the word "style" in code font in the two locations indicated.
|
Mike Morrison |
Apr 27, 2021 |
|
Printed, PDF |
Page 314
1st para after code example, 1st sentence |
Original: "Intl.DateTimeFormat can display dates using calendars other than the default Julian calendar based on the Christian era."
Question: Shouldn't this be "…Gregorian calendar…"?
Note from the Author or Editor: Yes, please change Julian to Gregorian
|
Jørgen Lang |
Oct 16, 2020 |
|
Printed, PDF |
Page 314
2nd code example, 2nd last line |
Original:
Intl.DateTimeFormat("en-u-ca-chinese", opts).format(d) // => "36 78"
Trying this in node and Chrome dev console, I get:
'2019(ji-hai)'
Which version is correct?
Note from the Author or Editor: I get "2019(ji-hai)" in Firefox as well, so whatever that old value was it was either wrong or no longer the default.
So please replace:
// => "36 78"
with:
// => "2019(ji-hai)"
To be honest, though, in the next edition I might just delete this entire line from the example. I'm trying to demonstrate calendar eras here and this one doesn't seem to have one.
|
Jørgen Lang |
Oct 16, 2020 |
|
Printed |
Page 319
11.8.1, 3rd line |
"as format" => "as a format"
|
Mike Morrison |
Apr 27, 2021 |
|
Printed |
Page 328
Last line of last paragraph |
It says
".. to iterate though a “partially used” iterator"
but it was probably intended to say
".. to iterate through a “partially used” iterator"
That is "though" => "through"
Note from the Author or Editor: Change though to through on the last line of prose on page 328
|
Hugo Gabriel Eyherabide |
Jan 30, 2021 |
|
Printed |
Page 333
Last line |
Appears
]
instead of
]
The exact text is
bol.Iterator]()
Note from the Author or Editor: Please replace the HTML entitty ] with a plain right bracket in code font: ']'
(This error does not appear in the QC2 draft, so it must have crept in during one of the very final production steps.)
|
Oscar Fernández Sierra |
Jul 30, 2020 |
|
Printed |
Page 333
Next-to-last line |
"method show in" => "method shown in"
Note from the Author or Editor: Please change "show" to "shown" on the second to last line.
On the last line of the page, change "]" to "]"
|
Mike Morrison |
Apr 27, 2021 |
|
Printed |
Page 340
Bullet item |
Text says:
"Generator functions can use the `yield` operator to specify thevalues that are returned by the iterator."
I wonder if it should say "`yield` statement"? 'yield' isn't an operator in the true sense, I believe?
Note from the Author or Editor: The text should not say "statement". Yield really isn't a statement. But it is confusing to call it an operator here. Please change "the yield operator" to "the yield keyword"
|
Jens Olaf Koch |
Oct 19, 2020 |
|
Printed, PDF |
Page 355
various locations throughout section 13.2.4 |
Problem: In various locations outside the section about Promise chaining method names are written as .method() with a prepended period.
Question: Should all instances of the prepended period be kept, even if they occur outside the context of chained promises?
Note from the Author or Editor: To be honest, I don't remember why I started writing .then() and .catch() instead of just then() and catch(). I think you're right that it was probably to emphasize the nature of promise chains. But as you point out it seems to get out of hand starting on page 355. I will consider taking all these extraneous periods out in the next edition: it is not clear to me that they make anything clearer here.
|
Jørgen Lang |
Oct 21, 2020 |
|
Printed, PDF |
Page 356
3rd full para, 2nd and 3rd sentence |
Original: "If you add a .finally() invocation to your Promise chain, then the callback you pass to .finally() will be invoked when the Promise you called it on settles. Your callback will be invoked if the Promise fulfills or rejects, and it will not be passed any arguments, so you can’t find out whether it fulfilled or rejected."
Question: Is "Your callback" the same as the one that's invoked in the previous sentence?
Note from the Author or Editor: Yes it is. But the wording is unclear. Please change:
"...will be invoked when the Promise you called it on settles. Your callback will be invoked if the Promise fulfills or rejects, and it will not be passed any arguments, so you can’t find out whether it fulfilled or rejected."
To:
"...will be invoked when the Promise you registered it with settles. That callback will be invoked if the Promise fulfills or rejects, and it will not be passed any arguments, so it cannot tell whether the Promise fulfilled or rejected."
|
Jørgen Lang |
Dec 03, 2020 |
|
Printed |
Page 358
2nd paragraph, 1st line |
"if the we get" => "if we get"
|
Mike Morrison |
Apr 28, 2021 |
|
Printed |
Page 359
First paragrapth, 8th line |
Last phrase of the first paragraph says:
A .catch() callback can throw a new error, but if it returns normally, **than** that return value is used to resolve and/or fulfill the associated Promise, and the error stops propagating.
Change to be made:
than => then
Note from the Author or Editor: Please change "than" to "then"
|
Oscar Fernandez Sierra |
Aug 08, 2020 |
|
Printed, PDF |
Page 362
2nd last paragraph |
3rd sentence: "Promise.resolve() takes a value as its single argument and returns a Promise that will immediately (but asynchronously) be fulfilled to that value."
5th sentence: "(To be clear: the Promises returned by these static methods are not already fulfilled or rejected when they are returned…)"
These two sentences seem to directly contradict each other. In sentence #3 it is said that "a Promise will **immediately** […] be fulfilled" while sentence #5 appears to state the opposite: "the Promises returned by these static methods **are not already fulfilled** or rejected when they are returned"
I suppose that the text in the parentheses is meant to be more specific, given some more details about the process, but I'm not absolutely sure. What am I missing?
Note from the Author or Editor: This is a confusing concept, and you're right that those two sentences do seem to contradict each other. I've tried to clarify in the long parenthetical, but maybe it is not clear enough.
Any event-based program, like JavaScript programs typically are consist of short bursts of synchronous code execution followed by waiting for events to occur so that they can be responded to. So "will immediately (but asynchronously) be fulfilled" basically means "this promise will be fulfilled as soon as the current chunk of code is done and we would otherwise go back to waiting for events."
|
Jørgen Lang |
Nov 24, 2020 |
|
Printed |
Page 367
Last paragraph, 3rd line |
It says:
"...are designed the way **the** are."
Change to be made:
the => they
resulting in
"...are designed the way **they** are."
|
Hugo Gabriel Eyherabide |
Feb 06, 2021 |
|
Printed |
Page 373
First code block under Sec.13.4.4 |
The redefined clock() function has exactly the wrong behavior that the author purport to prevent: when multiple promises are created manually in close succession using the clock() function, all will finish awaiting at roughly the same time.
The problem arise because the increment of this.count happens after the await expression. As a result, all manually created promises share the same un-incremented value of this.count in the definition of targetTime.
It is not enough to move the increment to before the await expression: while the awaiting time is now corrected, all promises will return with the post-increment value of this.count.
The proper fix is to create a local variable that captures the value of this.count, and then increment this.count, all before awaiting. The result code may looks at follows (checked in Node v12.16.3)
// original code before definition of targetTime omitted
let count_val = this.count;
let targetTime = this.startTime + count_val * interval;
this.count++;
await until(targetTime);
return { value: count_val };
// original code following the return omitted
Note from the Author or Editor: The reporter is absolutely right. I should have tested this more carefully.
Please replace the clock() function in 13.4.4 with the corrected code from https://github.com/davidflanagan/jstdg7/blob/master/ch13/clock2.js
|
Wing-Ho Ko |
Jul 15, 2020 |
|
Printed, PDF |
Page 377
13.5, last bullet point |
Original: You can create asynchronously iterable objects by implementing a [Symbol.asyncIterator]() method or by invoking an async function * generator function.
Question: Is there a particular reason to wrap "Symbol.asyncIterator()" in brackets here while it is written without brackets in the chapter itself?
Note from the Author or Editor: I like the square brackets on page 377. And I do the same thing with [Symbol.iterator]() in the final bulleted list of chapter 12, so let's keep this as is.
However, on page 373, in the first paragraph of 13.4.4, "Symbol.asyncIterator()" should be "[Symbol.asyncIterator]()"
|
Jørgen Lang |
Nov 24, 2020 |
|
Printed |
Page 381
Paragraph after first code example |
There's an extra unbalanced parenthesis in middle of the parenthetical sentence:
"in §14.3); see also the"
should be:
"in §14.3; see also the"
|
Mike Morrison |
Apr 30, 2021 |
|
Printed, PDF |
Page 386
section 14.3 |
Question: Is the varying formatting in section correct and consistent?
The sentence: "Remember also that when <code>prototype</code> appears in code font, it refers to an ordinary object property, not to the <code>prototype</code> attribute:" appears to contradict itself
Note from the Author or Editor: Thanks for catching this. Whenever I say "the prototype attribute" in section 14.3 the word "prototype" should be in italics, not in code font.
It looks like this was introduced during copy-editing with commit e8b9a5d117316e3e814c6c56cbb78f98dfbcd48b. The easiest fix might be to revert that commit and then manually fix the two or three valid edits it included.
|
Jørgen Lang |
Nov 25, 2020 |
|
Printed, PDF |
Page 391
3rd last paragraph, 2nd sentence |
Original: Typed array classes use the Symbol in the same way that the Array class does.
Issue: not classy enough
Suggested fix: Add "class" after "Symbol".
Note from the Author or Editor: The text is correct, but confusing as it is. I'm talking about this particular symbol under discussion Symbol.species. But because of the capitalization convention, it is not clear that I mean one particular symbol instead of the Symbol type. Adding "class" does not help. Let's fix this by naming the symbol explicitly.
Please change:
Typed array classes use the Symbol in the same way that the Array class does.
To:
Typed array classes use Symbol.species in the same way that the Array class does.
And set "Symbol.species" in code font as it is everywhere else in this section.
|
Jørgen Lang |
Nov 25, 2020 |
|
Printed |
Page 405
14.7.1, 2nd sentence |
Suggestion: Remove the word "if" from this phrase:
"we'll find that if we can query the proxy...and it will tell us that we should be able..."
Alternatively, the word "if" could remain, and the words "can" and "and" could both be removed instead.
Note from the Author or Editor: Change "that if we can query" to "that we can query"
|
Mike Morrison |
May 01, 2021 |
|
Printed |
Page 411
Last bullet point in box, 2nd sentence |
The word "on" seems superfluous in:
"...work with XML documents on..."
Note from the Author or Editor: Change "XML documents on" to "XML documents"
|
Mike Morrison |
May 03, 2021 |
|
|
Page 412
3rd paragraph |
The first sentence of the 3rd paragraph seems to have a typo. Remove the "a" after the "the" so it says: "A <script" tag with the src attribute"
Note from the Author or Editor: Please change "with the a src attribute" to "with a src attribute", deleting the extraneous "the"
|
Emrah Abdurahman |
Oct 02, 2021 |
|
Printed |
Page 415
<p>-Tag in lower listing |
I would suggest to add a closing </p> tag here (just to adhere to HTML best practice).
Note from the Author or Editor: In the example on page 415, add a closing '</p>' tag after "This is a <i>simple</i> document."
|
Jens Olaf Koch |
Oct 20, 2020 |
|
PDF |
Page 436
First paragrph, the 7th line. |
Original: "Capturing event handlers registered on the event target itself are not invoked."
Issue: The default behaviour in capture mode is that the event handler for the event target is indeed invoked after its parent and grandparent elements' event handlers are invoked. Unless the propagation is explicitly stopped in its parent element.
Suggestion: Remove not from the last sentence.
Note from the Author or Editor: Delete the last sentence of the first paragraph of page 436. And also in the sentence before that, delete "of the parent"
|
Khaled Elnaggar |
Apr 24, 2021 |
|
Printed |
Page 440
7th line of text |
Add "on", changing:
"whether it is a click a hyperlink."
to:
"whether it is a click on a hyperlink."
Note from the Author or Editor: Change "click a hyperlink" to "click on a hyperlink"
|
Mike Morrison |
May 04, 2021 |
|
|
Page 442
1st paragraph |
Regarding parentNode at the top of page 442. It is described in the context of being on the Element class but after searching for it on MDN it seems as though it is only defined on the Node class and not on the Element class. As the Element class is a subclass of the Node class, the parentNode property is inherited.
I wanted to clarify if parentNode should be removed from page 442 as it is defined on page 443 as part of the Node class.
Note from the Author or Editor: At the top of page 442, please change "parentNode" to "parentElement", and change "or a Document object" to "or null". ("null" should be set in constant width code font)
|
Emrah Abdurahman |
Oct 06, 2021 |
|
Printed |
Page 453
15.4.2, 2nd paragraph, 2nd sentence |
"correspond" should be "corresponds" in:
"The DOM defines a style property...that correspond to the style attribute."
Note from the Author or Editor: Change "correspond" to "corresponds". It is the singular style property that corresponds, not the Element objects.
|
Mike Morrison |
May 05, 2021 |
|
|
Page 458
5th paragraph |
Second sentence of the fifth paragraph.
Change the word "animate" to "animation" so it says "...triggers an animation".
Note from the Author or Editor: Please change "triggers an animate" to "triggers an animation"
|
Emrah Abdurahman |
Oct 09, 2021 |
|
Printed |
Page 459
1st full paragraph, 1st sentence |
"listen form" => "listen for"
|
Mike Morrison |
May 06, 2021 |
|
Printed |
Page 460
2nd paragraph, 3rd sentence |
It seems like "it" should be "they" in:
"...the CSS overflow property allows elements...to contain more content than it can display."
Note from the Author or Editor: Change "than it can display" to "than they can display"
|
Mike Morrison |
May 06, 2021 |
|
|
Page 461
First sentence of last paragraph |
The first paragraph states images as being block elements when they are inline elements by default.
Note from the Author or Editor: Please change "Block elements, such as images, paragraphs and <div> elements" to "Block elements, such as paragraphs and <div>s"
|
Emrah Abdurahman |
Oct 09, 2021 |
|
Printed |
Page 466
3rd line of text |
|
Mike Morrison |
May 06, 2021 |
|
Printed |
Page 466
1st full paragraph, 1st sentence |
"that it is used" => "that is used"
|
Mike Morrison |
May 06, 2021 |
|
|
Page 473
2nd paragraph |
"slotchanged" needs to be changed to "slotchange" to be accurate.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLSlotElement/slotchange_event
Note from the Author or Editor: Please change:
listener for "slotchanged" events
to:
listener for "slotchange" events
|
Emrah Abdurahman |
Oct 12, 2021 |
|
Printed |
Page 476
7th commented line on this page |
I think "do" should be "don't" here:
// in the template and do have to parse the HTML again.
Note from the Author or Editor: Please change "and do have to parse" to "and do not have to parse"
|
Mike Morrison |
May 07, 2021 |
|
|
Page 480
1st paragraph, last sentence |
The last sentence states "The function uses setTimeout() to ensure that it runs once a minute:".
The code specifies a timeout of 10,000 milliseconds, so this function runs 6 times a minute.
Note from the Author or Editor: Please change "runs once a minute" to "runs every 10 seconds".
|
Emrah Abdurahman |
Oct 13, 2021 |
|
Printed |
Page 489
2nd paragraph, 2nd sentence |
Maybe the 1st "size" is superfluous in:
"Instead, set the desired on-screen size CSS pixel size..."
Note from the Author or Editor: Please change "on-screen size CSS pixel size" to "on-screen CSS pixel size"
|
Mike Morrison |
May 08, 2021 |
|
|
Page 509
2nd paragraph |
The second paragraph lists some of the properties of the Location object, one of them being "path".
I believe the property name is "pathname" rather than just "path":
https://developer.mozilla.org/en-US/docs/Web/API/Location/pathname
Note from the Author or Editor: Please change "Properties like protocol, hostname, port and path" to "Properties like protocol, hostname, port and pathname"
|
Emrah Abdurahman |
Oct 18, 2021 |
|
|
Page 510
4th code block example |
"document.location.path" should be "document.location.pathname"
Note from the Author or Editor: Please change "document.location.path" to "document.location.pathname"
|
Emrah Abdurahman |
Oct 18, 2021 |
|
Printed |
Page 517
2nd block of comments after class definition (line 154 of code) |
maybe "try get" => "try to get"
Note from the Author or Editor: Change "we try get" to "we try to get"
|
Mike Morrison |
May 09, 2021 |
|
Printed |
Page 525
3rd paragraph, 1st sentence |
"is it" => "it is" in:
"With POST requests, is it..."
|
Mike Morrison |
May 10, 2021 |
|
Printed |
Page 528
2nd paragraph |
I think this paragraph (about the value "default") should be indented to match the indentation level of the next 4 paragraphs ("no-store", "reload", "no-cache", and "force-cache").
|
Mike Morrison |
May 10, 2021 |
|
Printed |
Page 529
source code |
Missing parentheses and semicolon in the example source code to complete the addEventListener() call
Printed
ticker.addEventListener("bid", (event) => {
displayNewBid(event.data);
}
Correct
ticker.addEventListener("bid", (event) => {
displayNewBid(event.data);
});
Note from the Author or Editor: In the middle of page 529, on the line following "displayNewBid(event.data);", please change "}" to "});"
|
Karmegam Pulendhiran |
Dec 20, 2020 |
|
|
Page 537
4th paragraph |
deleteItem() is the wrong name for the method. It is called removeItem() which is on Storage objects:
https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem
Note from the Author or Editor: Please change "and deleteItem() methods" to "and removeItem() methods"
|
Emrah Abdurahman |
Oct 22, 2021 |
|
|
Page 540
5th paragraph |
On the 5th paragraph before the code for the getCookies() function, the function is named in its non-plural form "getCookie()".
Note from the Author or Editor: Please change "defines a getCookie() function" to "defines a getCookies() function"
|
Emrah Abdurahman |
Oct 22, 2021 |
|
Printed |
Page 545
Example 15-13 |
On top of the file the following statement seems to be missing:
export {lookupCity, lookupZipcodes};
*
Without that statement I got the following error message in the developer console (Firefox):
Uncaught ReferenceError: import not found: lookupZipcodes (for zipcodes.js line 21, I believe)
Note from the Author or Editor: The code shown in the book is okay as it stands, since it is presented alone with no code using it. You're right, however, that the zipcodes.js file at https://github.com/davidflanagan/jstdg7/blob/master/ch15/zipcodes.js imports the code in this example as a module. I need to fix this in the github repo, and we might as well fix it in the book as well.
On page 547, please change "function lookupCity" to "export function lookupCity"
And change "function lookupZipcodes" to "export function lookupZipcodes"
|
Jens Olaf Koch |
Dec 04, 2020 |
|
Printed |
Page 545
Italicized caption of Example 15-13 |
|
Mike Morrison |
May 11, 2021 |
|
Printed |
Page 553
1st paragraph, 1st line |
"global postMesage()" => "global postMessage()"
|
Mike Morrison |
May 11, 2021 |
|
|
Page 553
1st statement of 1st code block |
This statement is missing the parentheses at the end when creating the new MessageChannel. It should be:
let channel = new MessageChannel();
Note from the Author or Editor: It is a little known fact of JavaScript syntax, that it is actually legal to omit the parentheses when invoking a constructor with no arguments. So this code works just fine as it is written. I didn't intend it that way, but the fact that it is legal syntax explains why it go past my linter without being flagged as a syntax error!
But this should be fixed. Please change "new MesssageChannel;" to "new MessageChannel();"
|
Emrah Abdurahman |
Oct 24, 2021 |
|
Printed |
Page 559
Block comment, 3rd paragraph (line 48 of code) |
|
Mike Morrison |
May 12, 2021 |
|
Printed |
Page 560
Block comment, 4th line (line 116 of code) |
"changes" => "change" ("parts...change")
|
Mike Morrison |
May 12, 2021 |
|
Printed |
Page 563
3rd commented line (line 239 of code) |
"which we do" => "which we are"
(alternatively: no change to this line, and instead "we're" => "we get" in the preceding line)
Note from the Author or Editor: Change this comment in the code:
// a second argument of false which we do when we get a popstate event
To:
// a second argument of false (when handling a popstate event, for example)
|
Mike Morrison |
May 12, 2021 |
|
Printed |
Page 564
Last else block of this page (line 320 of code) |
"logarithic" => "logarithmic"
|
Mike Morrison |
May 12, 2021 |
|
Printed |
Page 569
4th line of text |
"knowledge is is much" => "knowledge is much"
|
Mike Morrison |
Apr 28, 2021 |
|
Printed |
Page 571
15.15.6, 2nd bullet point, 4th word |
"visiblitychange" => "visibilitychange"
|
Mike Morrison |
May 10, 2021 |
|
Printed |
Page 573
15.15.8, 3rd bullet point |
|
Mike Morrison |
May 12, 2021 |
|
Printed |
Page 574
1st paragraph, last sentence |
unbalanced quotation marks in:
(using an <input type="file> form element)
Note from the Author or Editor: Change:
<input type="file>
To:
<input type="file">
|
Mike Morrison |
Apr 28, 2021 |
|
Printed |
Page 575
1st sentence |
"enables" => "enable" ("allow...and enable")
|
Mike Morrison |
May 12, 2021 |
|
Printed |
Page 579
2nd to last paragraph |
Actual text is "Node makes these available though the process.env object"
It should be "through" instead of "though"
|
Mark Sun |
Dec 31, 2020 |
|
Printed |
Page 581
5th line |
The next phrase contais a comma that mush be removed. In the form that appears in the printed version, the meaning of the phrase is just the opposite to the intended one:
... If you don no want unhandled rejections, to print error messages or terminate your program, register a global handler function:
....
==> remove the comma after "rejections"
Note from the Author or Editor: The sentence should read:
If you do not want unhandled rejections to print error messages or terminate your program, register a global handler function:
|
Oscar Fernandez Sierra |
Aug 03, 2020 |
|
Printed, PDF |
Page 598
1st para, 4th sentence |
Original: "An attacker could write an HTTP client that initiates requests for large files (such as images) but never actually reads the body of the request."
Issue: Client actually does not read the response body.
Suggested fix: Replace 'request' with 'response'
Note from the Author or Editor: Change "never actually reads the body of the request." to "never actually reads the body of the response."
|
Jørgen Lang |
Nov 06, 2020 |
|
Printed |
Page 598
Last paragraph, 2nd sentence |
"they becomes" => "they become"
|
Mike Morrison |
May 13, 2021 |
|
|
Page 602
2nd code block example |
The comment for os.networkInterfaces() has a period after the word "network".
Note from the Author or Editor: Please change "network. connections" to "network connections"
|
Emrah Abdurahman |
Nov 06, 2021 |
|
Printed |
Page 606
1st code example, try block, last comment line |
"they bytes" => "the bytes" or "they"
Note from the Author or Editor: Change "that they bytes" to "that the bytes"
|
Mike Morrison |
May 13, 2021 |
|
Printed |
Page 609
6th line starting from the bottom of the page, in a comment in the code |
Appears:
Two flags are combined with the bitwise OR opeartor | . The flags mean that
Change to be done: opeartor => operator
Note from the Author or Editor: Please change "opeartor" to "operator"
|
Oscar Fernandez Sierra |
Aug 06, 2020 |
|
Printed, PDF |
Page 610
continued code example on top of page |
Since there is only one "formatting" option for "type of error" I chose this one. This is not a severe problem, but probably a formatting error during production.
The indentation - esp. of the first two lines - appears to be a little exaggerated (21 chars in).
Suggested fix: Align with rest of code.
Note from the Author or Editor: Those lines do look strange at the top of page 610, but they are correctly indented.
When space allows, I like to indent function arguments written on separate lines
so that they all start at the column following the open parenthesis, and that is what I've done here. It would look fine if the pagebreak wasn't right there.
I see now, however, that there is an error on the very first line of page 610: that first line should end with a backtick character and a comma instead of the double-quote character that it currently ends with. That is change:
`Important data ${new Date().toISOString()}"
To:
`Important data ${new Date().toISOString()}`,
|
Jørgen Lang |
Nov 27, 2020 |
|
Printed |
Page 613
First block of comments at the bottom of the page |
There is a missing comma between "string" and "then" in the first line of comments:
Convert the body object to a JSON string then HTTPS POST ...
should appear:
Convert the body object to a JSON string, then HTTPS POST ...
or
Convert the body object to a JSON string and then HTTPS POST ...
The original code block is:
/*
* Convert the body object to a JSON string then HTTPS POST it to the
* specified API endpoint on the specified host. When the response arrives,
* parse the response body as JSON and resolve the returned Promise with
* that parsed value.
*/
I suppose the best option is the first one, to maintain uniformity with a phrase that has the same structure and that appears 6 lines below:
// Return a Promise object immediately, then call resolve or reject
Note from the Author or Editor: Honestly, my grasp of grammar rules for commas is shaky enough that I don' t know if it is actually an error to omit that comma. But I agree that it is clearer with a comma.
|
Oscar Fernandez Sierra |
Aug 28, 2020 |
|
Printed |
Page 616
else block, 5th comment line |
The first occurrence of "type" seems superfluous in:
// Now guess the type file's content type based on extension
Note from the Author or Editor: Please change "the type file's content type" to "the file's content type"
|
Mike Morrison |
May 13, 2021 |
|
Printed |
Page 619
Next-to-last invocation of output() (line 72 of code) |
What is the purpose of the template literal syntax in this line?
output(`${punchline}`, false);
Would it work the same if it were the following?
output(punchline, false);
Note from the Author or Editor: In the middle of page 619, change this line of code:
output(`${punchline}`, false)
To this simpler form:
output(punchline, false)
|
Mike Morrison |
May 13, 2021 |
|
Printed |
Page 625
Bullet point, 1st sentence |
Either "the" or "," seems superfluous in:
"the multiple cores, which"
Note from the Author or Editor: Change "across the multiple cores" to "across multiple cores"
|
Mike Morrison |
May 14, 2021 |
|
Printed, PDF |
Page 628 ff
Section 16.11.2 |
Question: Are the terms "main thread" and "parent thread" synonyms or is there a subtle difference, e.g. a possibility for "nested" threads that need a clear term for a "direct ancestor"?
Note from the Author or Editor: That is a good question, and should maybe be clarified in the text or in a footnote.
The main thread is the one that starts when Node starts. All other threads are worker threads. If the main thread creates a worker thread A, and worker thread A creates another worker thread B, then the parent thread of A is the main thread, but the parent thread of B is A. Often, the parent thread of a worker will be them main thread, but this will not be the case when a worker thread is created by another worker thread.
|
Jørgen Lang |
Nov 13, 2020 |
|
|
Page 629
3rd bullet point. 5th sentence in parentheses |
The word "with" is duplicated:
"...and we saw the same thing with with child processes..."
Note from the Author or Editor: Please change "with with" to "with"
|
Emrah Abdurahman |
Nov 11, 2021 |
|
Printed |
Page 630
7th line starting from the bottom of the page |
Appears:
it cannot copy object like SSockets and Streams. It can handle MessagePort objects.
Change to be done:
SSockets => Sockets (remove one of the two "S" at the beginning of the word)
Note about lack of uniformity in those names: in this line, "Sockets" and "Streams" appear with initial "S" (uppercase). The line before that one makes reference to the last paragraph of 16.11.1, in page 628, where that words appear as:
... such as sockets and streams. ...
(with initial lowercase in both words). This line is the 3rd line of that paragraph.
Note from the Author or Editor: Please change "SSockets and Streams" to "sockets and streams".
|
Oscar Fernandez Sierra |
Aug 06, 2020 |
|
Printed, PDF |
Page 630
section 16.11.4, 1st sentence |
Original: The postMessage() function uses the structured clone algorithm, and as we’ve noted, it cannot copy objects like SSockets and Streams.
Issue: SSockets
Suggestion: The postMessage() function uses the structured clone algorithm, and as we’ve noted, it cannot copy objects like Sockets and Streams.
Note from the Author or Editor: Please change "SSockets" to "Sockets"
|
Jørgen Lang |
Nov 13, 2020 |
|
Printed |
Page 632
16.11.5, 1st code example, 4th comment line |
"with" seems superfluous in:
// Now create a worker thread, passing the shared array to it with
Note from the Author or Editor: Please remove "with" at the end of that code comment
|
Mike Morrison |
May 14, 2021 |
|
Printed, PDF |
Page 635
bullet list, 2nd entry |
Original: "Prettier for formatting your JavaScript code in a standardized way."
Issue: "Unnecessary "for" after "Prettier".
Note from the Author or Editor: Most of the bullets begin with a tool name and "Prettier" is the name of the tool, so if you already know that Prettier is the name of a tool, then the sentence reads naturally as it is.
But I see now that if you have never heard of Prettier, then this looks like a typo.
Let's change "Prettier for formatting" to "The Prettier tool for formatting"
|
Jørgen Lang |
Nov 16, 2020 |
|
Printed |
Page 642
Last sentence before bird icon |
maybe "best...than" => "better...than" or "best...rather than"
Note from the Author or Editor: Change "user experience is best" to "user experience is better"
|
Mike Morrison |
May 15, 2021 |
|
Printed, PDF |
Page 644
17.6. 1st paragraph, last sentence |
Original: "Babel was created so that web developers could use the new language features of ES6 and later while still targeting web browsers that only supported ES5."
Issue: This sentence seems a little outdated. It might be helpful to point out that Babel also supports current developments in ES2020, etc.
Suggestion: "Babel was initially created so that web developers could use the new language features of ES6 and later while still targeting web browsers that only supported ES5. It is under constant development to also support current and future versions of the EcmaScript standard."
Note from the Author or Editor: This is a good idea. Please add the following sentence after "...while still targeting web browsers that only supported ES5.":
Babel continues to evolve, and it is common for language feature that are nearing standardization to be supported by Babel before they are implemented natively in browsers.
|
Jørgen Lang |
Nov 17, 2020 |
|
Other Digital Version |
644
Errata list |
"feature" should be "features" in the sentence to be added: "Babel continues to evolve, and it is common for language feature..."
|
Mike Morrison |
Apr 17, 2021 |
|
Printed, PDF |
Page 646
2nd complete code example after 2nd para, code comments |
Issue: In some of ther comments for said code example, the comments mention a <div/>-Element containing a trailing slash.
That would imply a self-closing version of <div>. AFAIK <div> always uses a closing tag, e.g. <div>...</div>.
Suggestions: Remove the trailing slash or place it before the 'div' part to denote a closing tag.
Note from the Author or Editor: Please change "// This is the first child of the <div/>" to:
"// This is the first child of the <div>"
And change "The second child of the <div/>." to:
"The second child of the <div>."
|
Jørgen Lang |
Nov 17, 2020 |
|
Printed |
Page 654
Next-to-last sentence |
|
Mike Morrison |
May 15, 2021 |
|
Printed |
Page 655
1st sentence |
|
Mike Morrison |
May 15, 2021 |
|
Printed, PDF |
Page 656
3rd para, 1st sentence |
Original: "If a property is not marked as optional in an object type, then it is required, and Flow will report an error if an appropriate property is not present in the actual value."
Question: Did you mean to say, "... is not present in the actual *type*."?
Note from the Author or Editor: "value" is correct, but unclear. Let's change "not present in the actual value" to "not present in an object that is assigned to a variable declared to be of that type".
|
Jørgen Lang |
Nov 18, 2020 |
|
Printed |
Page 659
17.8.7, 3rd paragraph |
maybe "types" => "type" in:
"the type of the keys and the types of the values"
Note from the Author or Editor: Please change "the types of the values" to "the type of the values"
|
Mike Morrison |
May 15, 2021 |
|
Printed, PDF |
Page 661
2nd last para |
Original: "To express the type of a function with Flow, write the types of each parameter, separate them with commas, enclose them in parentheses, and then follow that with an arrow and type return type of the function."
Issue: The last part ("…and type return type of the function.") of the sentence is unclear.
Did you mean, "…and **the** return type…"?
Note from the Author or Editor: Please change "type return type" to "the return type"
|
Jørgen Lang |
Nov 19, 2020 |
|