- Introduction
- Chapter 1 Values, Types, and Operators
- Chapter 2 Program Structure
- Expressions and statements
- Variables
- Keywords and reserved words
- The environment
- Functions
- The console.log function
- Return values
- prompt and confirm
- Control flow
- Conditional execution
- while and do loops
- Indenting Code
- for loops
- Breaking Out of a Loop
- Updating variables succinctly
- Dispatching on a value with switch
- Capitalization
- Comments
- Summary
- Exercises
- Chapter 3 Functions
- Chapter 4 Data Structures: Objects and Arrays
- Chapter 5 Higher-Order Functions
- Chapter 6 The Secret Life of Objects
- Chapter 7 Project: Electronic Life
- Chapter 8 Bugs and Error Handling
- Chapter 9 Regular Expressions
- Creating a regular expression
- Testing for matches
- Matching a set of characters
- Repeating parts of a pattern
- Grouping subexpressions
- Matches and groups
- The date type
- Word and string boundaries
- Choice patterns
- The mechanics of matching
- Backtracking
- The replace method
- Greed
- Dynamically creating RegExp objects
- The search method
- The lastIndex property
- Parsing an INI file
- International characters
- Summary
- Exercises
- Chapter 10 Modules
- Chapter 11 Project: A Programming Language
- Chapter 12 JavaScript and the Browser
- Chapter 13 The Document Object Model
- Chapter 14 Handling Events
- Chapter 15 Project: A Platform Game
- Chapter 16 Drawing on Canvas
- Chapter 17 HTTP
- Chapter 18 Forms and Form Fields
- Chapter 19 Project: A Paint Program
- Chapter 20 Node.js
- Chapter 21 Project: Skill-Sharing Website
- Eloquent JavaScript
- Exercise Hints
- Program Structure
- Functions
- Data Structures: Objects and Arrays
- Higher-Order Functions
- The Secret Life of Objects
- Project: Electronic Life
- Bugs and Error Handling
- Regular Expressions
- Modules
- Project: A Programming Language
- The Document Object Model
- Handling Events
- Project: A Platform Game
- Drawing on Canvas
- HTTP
- Forms and Form Fields
- Project: A Paint Program
- Node.js
- Project: Skill-Sharing Website
Data Structures: Objects and Arrays
The sum of a range
Building up an array is most easily done by first initializing a variable to []
(a fresh, empty array) and repeatedly calling its push
method to add a value. Don’t forget to return the array at the end of the function.
Since the end boundary is inclusive, you’ll need to use the <=
operator rather than simply <
to check for the end of your loop.
To check whether the optional step argument was given, either check arguments.length
or compare the value of the argument to undefined
. If it wasn’t given, simply set it to its default value (1) at the top of the function.
Having range
understand negative step values is probably best done by writing two separate loops—one for counting up and one for counting down—because the comparison that checks whether the loop is finished needs to be >=
rather than <=
when counting downward.
It might also be worthwhile to use a different default step, namely, -1, when the end of the range is smaller than the start. That way, range(5, 2)
returns something meaningful, rather than getting stuck in an infinite loop.
Reversing an array
There are two obvious ways to implement reverseArray
. The first is to simply go over the input array from front to back and use the unshift
method on the new array to insert each element at its start. The second is to loop over the input array backward and use the push
method. Iterating over an array backward requires a (somewhat awkward) for
specification like (var i = array.length - 1; i >= 0; i--)
.
Reversing the array in place is harder. You have to be careful not to overwrite elements that you will later need. Using reverseArray
or otherwise copying the whole array ( array.slice(0)
is a good way to copy an array) works but is cheating.
The trick is to swap the first and last elements, then the second and second-to-last, and so on. You can do this by looping over half the length of the array (use Math.floor
to round down—you don’t need to touch the middle element in an array with an odd length) and swapping the element at position i
with the one at position array.length - 1 - i
. You can use a local variable to briefly hold on to one of the elements, overwrite that one with its mirror image, and then put the value from the local variable in the place where the mirror image used to be.
A list
Building up a list is best done back to front. So arrayToList
could iterate over the array backward (see previous exercise) and, for each element, add an object to the list. You can use a local variable to hold the part of the list that was built so far and use a pattern like list = {value: X, rest: list}
to add an element.
To run over a list (in listToArray
and nth
), a for
loop specification like this can be used:
for (var node = list; node; node = node.rest) {}
Can you see how that works? Every iteration of the loop, node
points to the current sublist, and the body can read its value
property to get the current element. At the end of an iteration, node
moves to the next sublist. When that is null, we have reached the end of the list and the loop is finished.
The recursive version of nth
will, similarly, look at an ever smaller part of the “tail” of the list and at the same time count down the index until it reaches zero, at which point it can return the value
property of the node it is looking at. To get the zeroeth element of a list, you simply take the value
property of its head node. To get element N + 1, you take the Nth element of the list that’s in this list’s rest
property.
Deep comparison
Your test for whether you are dealing with a real object will look something like typeof x == "object" && x != null
. Be careful to compare properties only when both arguments are objects. In all other cases you can just immediately return the result of applying ===
.
Use a for
/ in
loop to go over the properties. You need to test whether both objects have the same set of property names and whether those properties have identical values. The first test can be done by counting the properties in both objects and returning false if the numbers of properties are different. If they’re the same, then go over the properties of one object, and for each of them, verify that the other object also has the property. The values of the properties are compared by a recursive call to deepEqual
.
Returning the correct value from the function is best done by immediately returning false when a mismatch is noticed and returning true at the end of the function.
This is a book about getting computers to do what you want them to do. Computers are about as common as screwdrivers today, but they contain a lot more hidden complexity and thus are harder to operate and understand. To many, they remain alien, slightly threatening things.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论