1. Trang chủ
  2. » Công Nghệ Thông Tin

Eloquent javascript, 2nd edition

478 1,3K 4

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 478
Dung lượng 6,16 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

This is a book about getting computers to do what youwant them to do. Computers are about as common asscrewdrivers today, but they contain a lot more hiddencomplexity and thus are harder to operate and understand.To many, they remain alien, slightly threateningthings.

Trang 1

JavaScript lies at the heart of almost every

modern web application, from social apps to

the newest browser-based games Though

simple for beginners to pick up and play with,

JavaScript is a flexible, complex language that

you can use to build full-scale applications

Eloquent JavaScript, 2nd Edition dives

deep into the JavaScript language to show you

how to write beautiful, effective code Author

Marijn Haverbeke immerses you in example

code from the start, while exercises and

full-chapter projects give you hands-on experience

with writing your own programs As you build

projects such as an artificial life simulation,

a simple programming language, and a paint

program, you’ll learn:

 The essential elements of programming,

including syntax, control, and data

 How to organize and clarify your code with

object-oriented and functional programming

modern-in an modern-inter active sandbox, where you can edit the code, run it, and see its output instantly

Isn’t it time you became fluent in the language

of the Web?

About the AuthorMarijn Haverbeke is an independent developer and author, focused primarily on programming languages and tools for programmers He spends most of his time working on open source software, such as the CodeMirror editor and the Tern type inference engine

$39.95 ($41.95 CDN) Shelve In: Programming Languages/JavaScript

TH E FI N EST I N G E E K E NTE RTAI N M E NT™

w w w.nostarch.com “I LIE FLAT.” This book uses a durable binding that won’t snap shut.

5 3 9 9 5

9 781593 275846

ISBN: 978-1-59327-584-6

6 89145 75846 7 SFI-00000

Master the Language

Trang 3

ELOQUENT JAVASCRIPT

www.it-ebooks.info

Trang 5

Praise for the first edition of EloquEnt JavaScript

“I became a better architect, author, mentor and developer because of this book It deserves to share shelf space with Flannagan and Crockford.”

—Angus Croll, TwiTTer Developer

“This is the book I give out when people ask me how to learn proper

JavaScript.”

—Chris williAms, orgAnizer of JsConf us

“One of the best JavaScript books I’ve read.”

—rey BAngo, JQuery TeAm memBer AnD ClienT-weB CommuniTy progrAm

mAnAger AT miCrosofT

“A really good guide to JavaScript; but even more than that, this book is a great guide to programming.”

—Ben nADel, Chief sofTwAre engineer AT epiCenTer ConsulTing

“A good book, suitable for those without experience in JavaScript and even those without programming experience.”

—niCholAs zAkAs, AuThor of H igH P erformance J ava S criPtAnD

t He P rinciPleS of o bJect -o riented J ava S criPt

“Does a good job of detailing the fundamentals and explaining concepts like the stack and the environment This attention to detail is what sets the book apart from other JavaScript books.”

—DesignorATi

“If you’re new to JavaScript, the first thing I’d recommend you do is visit

Eloquent JavaScript and check out Marijn Haverbeke’s introduction to the

language.”

—CneT uk

www.it-ebooks.info

Trang 7

EloquEnt JavaScript

Trang 8

EloquEnt JavaScript, 2nd Edition Copyright © 2015 by Marijn Haverbeke.

All rights reserved No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher.

Publisher: William Pollock

Production Editor: Serena Yang

Cover Illustration: Wasif Hyder

Developmental Editor: Jennifer Griffith-Delgado

Technical Reviewers: Alex Cash, Angus Croll, and Peter van der Zee

Copyeditor: Kim Wimpsett

Compositor: Serena Yang

Proofreader: James M Fraleigh

The illustrations are contributed by various artists: computer (introduction) and unicycle people

(Chapter 21) by Max Xiantu Sea of bits (Chapter 1) and weresquirrel (Chapter 4) by Margarita

Martínez and José Menor Octopuses (Chapter 2 and 4) by Jim Tierney Object with on/off switch (Chapter 6) by Dyle MacGregor Regular expression diagrams in Chapter 9 generated with Regexper

by Jeff Avallone Game concept for Chapter 15 by Thomas Palef Pixel art in Chapter 16 by Antonio Perdomo Pastor.

For information on distribution, translations, or bulk sales, please contact No Starch Press, Inc directly:

No Starch Press, Inc.

245 8th Street, San Francisco, CA 94103

in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark.

The information in this book is distributed on an “As Is” basis, without warranty While every precaution has been taken in the preparation of this work, neither the author nor No Starch Press, Inc shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in it.

Trang 9

For Lotte and Jan

www.it-ebooks.info

Trang 11

B R I E F C O N T E N T S

Introduction 1

PART I: LANGUAGE Chapter 1: Values, Types, and Operators 11

Chapter 2: Program Structure 23

Chapter 3: Functions 41

Chapter 4: Data Structures: Objects and Arrays 59

Chapter 5: Higher-Order Functions 81

Chapter 6: The Secret Life of Objects 99

Chapter 7: Project: Electronic Life 119

Chapter 8: Bugs and Error Handling 139

Chapter 9: Regular Expressions 153

Chapter 10: Modules 175

Chapter 11: Project: A Programming Language .191

PART II: BROWSER Chapter 12: JavaScript and the Browser 207

Chapter 13: The Document Object Model 215

Chapter 14: Handling Events 235

Chapter 15: Project: A Platform Game 253

Chapter 16: Drawing on Canvas 275

Chapter 17: HTTP 299

Chapter 18: Forms and Form Fields 315

Chapter 19: Project: A Paint Program 331

PART III: BEYOND Chapter 20: Node.js 347

Chapter 21: Project: Skill-Sharing Website 367

Chapter 22: JavaScript and Performance .389

Exercise Hints 407

Index 429

www.it-ebooks.info

Trang 13

C O N T E N T S I N D E T A I L

On Programming 2

Why Language Matters 3

What Is JavaScript? 6

Code, and What to Do with It 7

Overview of This Book 7

Typographic Conventions 8

PART I: LANGUAGE 1 VALUES, TYPES, AND OPERATORS 11 Values 12

Numbers 12

Arithmetic 13

Special Numbers 14

Strings 14

Unary Operators 15

Boolean Values 16

Comparisons 16

Logical Operators 17

Undefined Values 18

Automatic Type Conversion 18

Short-Circuiting of Logical Operators 19

Summary 20

2 PROGRAM STRUCTURE 23 Expressions and Statements 23

Variables 24

Keywords and Reserved Words 26

The Environment 26

Functions 27

The console.log Function 27

Return Values 28

Prompt and Confirm 28

Control Flow 29

www.it-ebooks.info

Trang 14

Conditional Execution 29

while and do Loops 31

Indenting Code 32

for Loops 33

Breaking Out of a Loop 33

Updating Variables Succinctly 34

Dispatching on a Value with switch 35

Capitalization 35

Comments 36

Summary 37

Exercises 37

Looping a Triangle 37

FizzBuzz 38

Chess Board 38

3 FUNCTIONS 41 Defining a Function 42

Parameters and Scopes 43

Nested Scopes 44

Functions as Values 45

Declaration Notation 45

The Call Stack 46

Optional Arguments 47

Closure 48

Recursion 50

Growing Functions 52

Functions and Side Effects 54

Summary 55

Exercises 56

Minimum 56

Recursion 56

Bean Counting 56

4 DATA STRUCTURES: OBJECTS AND ARRAYS 59 The Weresquirrel 60

Data Sets 60

Properties 61

Methods 62

Objects 63

Mutability 65

The Lycanthrope’s Log 66

Computing Correlation 68

Objects as Maps 69

Trang 15

The Final Analysis 70

Further Arrayology 72

Strings and Their Properties 73

The arguments Object 74

The Math Object 75

The Global Object 77

Summary 77

Exercises 78

The Sum of a Range 78

Reversing an Array 78

A List 78

Deep Comparison 79

5 HIGHER-ORDER FUNCTIONS 81 Abstraction 82

Abstracting Array Traversal 83

Higher-Order Functions 84

Passing Along Arguments 86

JSON 87

Filtering an Array 88

Transforming with map 89

Summarizing with reduce 89

Composability 90

The Cost 91

Great-great-great-great- 92

Binding 94

Summary 95

Exercises 95

Flattening 95

Mother-Child Age Difference 95

Historical Life Expectancy 96

Every and Then Some 96

6 THE SECRET LIFE OF OBJECTS 99 History 99

Methods .100

Prototypes .101

Constructors 103

Overriding Derived Properties 104

Prototype Interference .105

Prototype-less Objects .107

Polymorphism .107

Laying Out a Table .108

www.it-ebooks.info

Trang 16

Getters and Setters 113

Inheritance 114

The instanceof Operator 115

Summary .116

Exercises 117

A Vector Type .117

Another Cell .117

Sequence Interface .117

7 PROJECT: ELECTRONIC LIFE 119 Definition .119

Representing Space 120

A Critter’s Programming Interface .122

The World Object .123

this and Its Scope 125

Animating Life 126

It Moves .128

More Life-forms .129

A More Lifelike Simulation .130

Action Handlers .131

Populating the New World .133

Bringing the World to Life .134

Exercises 135

Artificial Stupidity .135

Predators 136

8 BUGS AND ERROR HANDLING 139 Programmer Mistakes .139

Strict Mode .140

Testing 141

Debugging 142

Error Propagation 144

Exceptions .145

Cleaning Up After Exceptions .146

Selective Catching .147

Assertions 149

Summary .150

Exercises 150

Retry .150

The Locked Box .151

Trang 17

Creating a Regular Expression .153

Testing for Matches .154

Matching a Set of Characters .154

Repeating Parts of a Pattern 156

Grouping Subexpressions .157

Matches and Groups 157

The Date Type 158

Word and String Boundaries 160

Choice Patterns 160

The Mechanics of Matching .161

Backtracking .162

The replace Method 163

Greed .165

Dynamically Creating RegExp Objects .166

The search Method .167

The lastIndex Property 167

Looping over Matches .168

Parsing an INI File .168

International Characters .170

Summary .171

Exercises 172

Regexp Golf .172

Quoting Style .173

Numbers Again 173

10 MODULES 175 Why Modules Help .175

Namespacing 176

Reuse .176

Decoupling .177

Using Functions as Namespaces .177

Objects as Interfaces 179

Detaching from the Global Scope .180

Evaluating Data as Code .180

The require Function .181

Slow-Loading Modules .183

Interface Design .185

Predictability 186

Composability .186

Layered Interfaces .186

www.it-ebooks.info

Trang 18

Summary .187

Exercises 187

Month Names .187

A Return to Electronic Life .187

Circular Dependencies 188

11 PROJECT: A PROGRAMMING LANGUAGE 191 Parsing .191

The Evaluator .195

Special Forms .196

The Environment .198

Functions .199

Compilation 200

Cheating 201

Exercises 202

Arrays .202

Closure .202

Comments .202

Fixing Scope 202

PART II: BROWSER 12 JAVASCRIPT AND THE BROWSER 207 Networks and the Internet .207

The Web .209

HTML 209

HTML and JavaScript 211

In the Sandbox .212

Compatibility and the Browser Wars .213

13 THE DOCUMENT OBJECT MODEL 215 Document Structure .215

Trees .216

The Standard 217

Moving Through the Tree .218

Finding Elements .219

Changing the Document 220

Creating Nodes .221

Attributes .222

Layout .224

Trang 19

Styling 226

Cascading Styles .227

Query Selectors .229

Positioning and Animating 229

Summary .231

Exercises 232

Build a Table .232

Elements by Tag Name .232

The Cat’s Hat .233

14 HANDLING EVENTS 235 Event Handlers .235

Events and DOM Nodes .236

Event Objects .237

Propagation 237

Default Actions .239

Key Events .239

Mouse Clicks 241

Mouse Motion 242

Scroll Events 244

Focus Events .245

Load Event .246

Script Execution Timeline .246

Setting Timers .247

Debouncing 248

Summary .250

Exercises 250

Censored Keyboard .250

Mouse Trail 250

Tabs .251

15 PROJECT: A PLATFORM GAME 253 The Game .254

The Technology 254

Levels 255

Reading a Level .256

Actors .257

Encapsulation as a Burden 259

Drawing .260

Motion and Collision 264

Actors and Actions 266

Tracking Keys .270

Running the Game 271

www.it-ebooks.info

Trang 20

Exercises 273

Game Over .273

Pausing the Game 273

16 DRAWING ON CANVAS 275 SVG 276

The Canvas Element 277

Filling and Stroking .278

Paths .278

Curves 280

Drawing a Pie Chart .283

Text .284

Images .284

Transformation .286

Storing and Clearing Transformations 288

Back to the Game .290

Choosing a Graphics Interface 295

Summary .295

Exercises 296

Shapes 296

The Pie Chart .297

A Bouncing Ball 297

Precomputed Mirroring .297

17 HTTP 299 The Protocol 299

Browsers and HTTP .301

XMLHttpRequest .302

Sending a Request .303

Asynchronous Requests 304

Fetching XML Data 304

HTTP Sandboxing 305

Abstracting Requests .306

Promises .308

Appreciating HTTP 310

Security and HTTPS .311

Summary .311

Exercises 312

Content Negotiation 312

Waiting for Multiple Promises .313

Trang 21

Fields 315

Focus 317

Disabled Fields .318

The Form as a Whole .318

Text Fields .319

Checkboxes and Radio Buttons .321

Select Fields 322

File Fields .323

Storing Data Client-Side .325

Summary .327

Exercises 327

A JavaScript Workbench 327

Autocompletion .328

Conway’s Game of Life .328

19 PROJECT: A PAINT PROGRAM 331 Implementation .332

Building the DOM .332

The Foundation 333

Tool Selection .334

Color and Brush Size .336

Saving 337

Loading Image Files 339

Finishing Up .340

Exercises 341

Rectangles 342

Color Picker .342

Flood Fill .343

PART III: BEYOND 20 NODE.JS 347 Background .347

Asynchronicity 348

The node Command .349

Modules .350

Installing with NPM .351

www.it-ebooks.info

Trang 22

The Filesystem Module .353The HTTP Module .354Streams 356

A Simple File Server .357Error Handling .361Summary .363Exercises 363

Content Negotiation, Again .363Fixing a Leak .364Creating Directories .364

A Public Space on the Web .364

21

Design 368Long Polling 369HTTP Interface 369The Server .372

Routing 372Serving Files .373Talks as Resources .374Long-Polling Support 376The Client 379

HTML .379Starting up 380Displaying Talks .382Updating the Server .384Noticing Changes 385Exercises 386

Disk Persistence .386Comment Field Resets 386Better Templates 387The Unscriptables .387

22

Staged Compilation 390Graph Layout .390Defining a Graph 392

A First Force-Directed Layout Function 393Profiling .395Function Inlining .396Going Back to Old-school Loops .397Avoiding Work 398

xviii Contents in Detail

Trang 23

Creating Less Garbage 399

Data Structures: Objects and Arrays 409

The Sum of a Range .409

Reversing an Array 409

A List 410

Deep Comparison 410

Higher-Order Functions 411

Mother-Child Age Difference .411

Historical Life Expectancy .411

Every and Then Some .411

The Secret Life of Objects 411

Trang 24

Project: A Programming Language .415

Arrays .415Closure .416Comments .416Fixing Scope 416The Document Object Model 416

Build a Table .416Elements by Tag Name .417Handling Events .417

Censored Keyboard .417Mouse Trail 417Tabs .418Project: A Platform Game .418

Game Over .418Pausing the Game 418Drawing on Canvas 419

Shapes 419The Pie Chart .419

A Bouncing Ball 420Precomputed Mirroring .420HTTP .420

Content Negotiation 420Waiting for Multiple Promises .421Forms and Form Fields .421

A JavaScript Workbench 421Autocompletion .421Conway’s Game of Life .422Project: A Paint Program .422

Rectangles 422Color Picker .423Flood Fill .423Node.js .424

Content Negotiation, Again .424Fixing a Leak .424Creating Directories .424

A Public Space on the Web .425Project: Skill-Sharing Website 425

Disk Persistence .425Comment Field Resets 425Better Templates 426The Unscriptables .426JavaScript and Performance .426

Pathfinding .426Optimizing .427

Trang 25

I N T R O D U C T I O N

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 under- stand To many, they remain alien, slightly threatening things.

We’ve found two effective ways of bridging the communication gap tween us, squishy biological organisms with a talent for social and spatial rea-soning, and computers, unfeeling manipulators of meaningless data Thefirst is to appeal to our sense of the physical world and build interfaces that

be-www.it-ebooks.info

Trang 26

mimic that world and allow us to manipulate shapes on a screen with ourfingers This works very well for casual machine interaction.

But we have not yet found a good way to use the point-and-click proach to communicate things to the computer that the designer of the in-terface did not anticipate For open-ended interfaces, such as instructing thecomputer to perform arbitrary tasks, we’ve had more luck with an approachthat makes use of our talent for language: teaching the machine a language.Human languages allow words and phrases to be combined in manyways, which allows us to say many different things Computer languages,though typically less grammatically flexible, follow a similar principle.Casual computing has become much more widespread in the past

ap-20 years, and language-based interfaces, which once were the default way

in which people interacted with computers, have largely been replaced withgraphical interfaces But they are still there, if you know where to look Onesuch language, JavaScript, is built into almost every web browser and is thusavailable on just about every consumer device

This book intends to make you familiar enough with this language to beable to make a computer do what you want

On Programming

I do not enlighten those who are not eager to learn, nor arousethose who are not anxious to give an explanation themselves If Ihave presented one corner of the square and they cannot comeback to me with the other three, I should not go over the pointsagain

—Confucius

Besides explaining JavaScript, I also will introduce the basic principles ofprogramming Programming, it turns out, is hard The fundamental rulesare typically simple and clear But programs built on top of these rules tend

to become complex enough to introduce their own rules and complexity.You’re building your own maze, in a way, and you might just get lost in it.There will be times when reading this book will feel terribly frustrating

If you are new to programming, there will be a lot of new material to digest

Much of this material will then be combined in ways that require you to make

additional connections

It is up to you to make the necessary effort When you are struggling tofollow the book, do not jump to any conclusions about your own capabilities.You are fine—you just need to keep at it Take a break, reread some mate-

rial, and always make sure you read and understand the example programs

and exercises Learning is hard work, but everything you learn is yours andwill make subsequent learning easier

The computer programmer is a creator of universes for which he[sic] alone is responsible Universes of virtually unlimited com-plexity can be created in the form of computer programs

—Joseph Weizenbaum, Computer Power and Human Reason

Trang 27

A program is many things It is a piece of text typed by a programmer; it

is the directing force that makes the computer do what it does; it is data inthe computer’s memory, yet it controls the actions performed on this samememory Analogies that try to compare programs to objects we are familiarwith tend to fall short A superficially fitting one is that of a machine—lots

of separate parts tend to be involved, and to make the whole thing tick, wehave to consider the ways in which these parts interconnect and contribute

to the operation of the whole

A computer is a machine built to act as a host for these immaterial chines Computers themselves can do only stupidly straightforward things.The reason they are so useful is that they do these things at an incrediblyhigh speed A program can ingeniously combine an enormous number ofthese simple actions in order to do very complicated things

ma-To some of us, writing computer programs is a fascinating game A gram is a building of thought It is costless to build, it is weightless, and itgrows easily under our typing hands

pro-But without care, a program’s size and complexity will grow out of trol, confusing even the person who created it Keeping programs undercontrol is the main problem of programming When a program works, it isbeautiful The art of programming is the skill of controlling complexity Thegreat program is subdued—simple in its complexity

con-Many programmers believe that this complexity is best managed by ing only a small set of well-understood techniques in their programs Theyhave composed strict rules (“best practices”) prescribing the form programsshould have, and the more zealous among them will consider those who go

us-outside of this safe little zone to be bad programmers.

What hostility to the richness of programming—to try to reduce it tosomething straightforward and predictable, to place a taboo on all the weirdand beautiful programs! The landscape of programming techniques is enor-mous, fascinating in its diversity, and still largely unexplored It is certainlydangerous going, luring the inexperienced programmer into all kinds ofconfusion, but that only means you should proceed with caution and keepyour wits about you There will always be new challenges and new territory

to explore Programmers who refuse to keep exploring will stagnate, forgettheir joy, and get bored with their craft

Why Language Matters

In the beginning, at the birth of computing, there were no programminglanguages Programs looked something like this:

Trang 28

of switches in the right position or punch holes in strips of cardboard andfeed them to the computer You can probably imagine how how tediousand error-prone this procedure was Even writing simple programs requiredmuch cleverness and discipline Complex ones were nearly inconceivable.

Of course, manually entering these arcane patterns of bits (the ones andzeros) did give the programmer a profound sense of being a mighty wizard.And that has to be worth something in terms of job satisfaction

Each line of the previous program contains a single instruction It could

be written in English like this:

1 Store the number 0 in memory location 0.

2 Store the number 1 in memory location 1.

3 Store the value of memory location 1 in memory location 2.

4 Subtract the number 11 from the value in memory location 2.

5 If the value in memory location 2 is the number 0, continue with instruction 9.

6 Add the value of memory location 1 to memory location 0.

7 Add the number 1 to the value of memory location 1.

8 Continue with instruction 3.

9 Output the value of memory location 0.

Although that is already more readable than the soup of bits, it is stillrather unpleasant It might help to use names instead of numbers for theinstructions and memory locations

Set "total" to 0.

Set "count" to 1.

[loop]

Set "compare" to "count".

Subtract 11 from "compare".

If "compare" is zero, continue at [end].

Add "count" to "total".

Trang 29

The program wants to see whethercountis equal to 11 in order to decidewhether it can stop running Because our hypothetical machine is ratherprimitive, it can only test whether a number is zero and make a decision (orjump) based on that So it uses the memory location labeledcompareto com-pute the value ofcount - 11and makes a decision based on that value Thenext two lines add the value ofcountto the result and incrementcountby 1every time the program has decided thatcountis not 11 yet.

Here is the same program in JavaScript:

var total = 0, count = 1;

This version gives us a few more improvements Most importantly, there

is no need to specify the way we want the program to jump back and forthanymore Thewhilelanguage construct takes care of that It continues exe-cuting the block (wrapped in braces) below it as long as the condition it wasgiven holds That condition iscount <= 10, which means “countis less than

or equal to 10.” We no longer have to create a temporary value and pare that to zero, which was an uninteresting detail Part of the power ofprogramming languages is that they take care of uninteresting details for us

com-At the end of the program, afterwhilehas finished, theconsole.logation is applied to the result in order to write it as output

oper-Finally, here is what the program could look like if we happened to havethe convenient operationsrangeandsumavailable, which create a collection

of numbers within a range and compute the sum of a collection of numbers,respectively:

console.log(sum(range(1, 10)));

// . 55

The moral of this story is that the same program can be expressed inlong and short, unreadable and readable ways The first version of the pro-gram was extremely obscure, whereas this last one is almost English:logthe

sumof therangeof numbers from 1 to 10 (We will see in later chapters how

to build operations likesumandrange.)

A good programming language helps the programmer by allowing them

to talk about the actions that the computer has to perform on a higher level

It helps omit uninteresting details, provides convenient building blocks (such

aswhileandconsole.log), allows you to define your own building blocks (such

assumandrange), and makes those blocks easy to compose

www.it-ebooks.info

Trang 30

What Is JavaScript?

JavaScript was introduced in 1995 as a way to add programs to web pages inthe Netscape Navigator browser The language has since been adopted by allother major graphical web browsers It has made modern web applicationspossible—applications with which you can interact directly, without doing apage reload for every action But it is also used in more traditional websites

to provide various forms of interactivity and cleverness

It is important to note that JavaScript has almost nothing to do with theprogramming language named Java The similar name was inspired by mar-keting considerations, rather than good judgment When JavaScript wasintroduced, the Java language was being heavily marketed and was gainingpopularity Someone thought it was a good idea to ride on the coattails ofthis success Now we are stuck with the name

After JavaScript’s widespread adoption, a standard document was ten to describe the way the language should work to make sure the variouspieces of software that claimed to support JavaScript were actually talkingabout the same language This is called the ECMAScript standard, after theECMA organization that did the standardization In practice, the terms EC-MAScript and JavaScript can be used interchangeably—they are two namesfor the same language

writ-There are those who will say terrible things about the JavaScript language.

Many of these things are true When I was required to write something inJavaScript for the first time, I quickly came to despise it It would accept al-most anything I typed but interpret it in a way that was completely differentfrom what I meant This had a lot to do with the fact that I did not have aclue what I was doing, of course, but there is a real issue here: JavaScript isridiculously liberal in what it allows The idea behind this design was that itwould make programming in JavaScript easier for beginners In actuality, itmostly makes finding problems in your programs harder because the systemwill not point them out to you

This flexibility also has its advantages, though It leaves space for a lot oftechniques that are impossible in more rigid languages, and as you will see(for example, in Chapter 10), it can be used to overcome some of JavaScript’sshortcomings After learning the language properly and working with it for a

while, I have learned to actually like JavaScript.

There have been several versions of JavaScript ECMAScript version 3was the most widely supported version at the time of JavaScript’s ascent todominance, roughly between 2000 and 2010 During this time, work wasunderway on an ambitious version 4, which planned a number of radicalimprovements and extensions to the language Changing a living, widelyused language in such a radical way turned out to be politically difficult,and work on version 4 was abandoned in 2008, leading to the much lessambitious version 5 that came out in 2009 We’re now at the point whereall major browsers support version 5, which is the version that this bookwill be focusing on Version 6 is in the process of being finalized, and somebrowsers are starting to support new features from this version

Trang 31

Web browsers are not the only platforms on which JavaScript is used.Some databases, such as MongoDB and CouchDB, use JavaScript as theirscripting and query language Several platforms for desktop and server pro-gramming, most notably the Node.js project (the subject of Chapter 20), areproviding a powerful environment for programming JavaScript outside ofthe browser.

Code, and What to Do with It

Code is the text that makes up programs Most chapters in this book tain quite a lot of it In my experience, reading code and writing code areindispensable parts of learning to program, so try to not just glance over theexamples Read them attentively and understand them This may be slowand confusing at first, but I promise that you will quickly get the hang of it.The same goes for the exercises Don’t assume you understand them untilyou’ve actually written a working solution

con-I recommend you try your solutions to exercises in an actual JavaScriptinterpreter That way, you’ll get immediate feedback on whether what youare doing is working, and, I hope, you’ll be tempted to experiment and gobeyond the exercises

The easiest way to run the example code in the book, and to

exper-iment with it, is to look it up in the online version of the book at http://

eloquentjavascript.net/ There, you can click any code example to edit and

run it and to see the output it produces To work on the exercises, go to

http://eloquentjavascript.net/code/ , which provides starting code for each

cod-ing exercise and allows you to look at the solutions

If you want to run the programs defined in this book outside of thebook’s sandbox, some care is required Many examples stand on their ownand should work in any JavaScript environment But code in later chapters

is mostly written for a specific environment (the browser or Node.js) andcan run only there In addition, many chapters define bigger programs, andthe pieces of code that appear in them depend on each other or on externalfiles The sandbox on the website provides links to Zip files containing all ofthe scripts and data files necessary to run the code for a given chapter

Overview of This Book

This book contains roughly three parts The first 11 chapters discuss theJavaScript language itself The next eight chapters are about web browsersand the way JavaScript is used to program them Finally, two chapters aredevoted to Node.js, another environment to program JavaScript in

Throughout the book, there are five project chapters, which describe larger

example programs to give you a taste of real programming In order of pearance, we will work through building an artificial life simulation, a pro-gramming language, a platform game, a paint program, and a dynamicwebsite

www.it-ebooks.info

Trang 32

The language part of the book starts with four chapters to introduce thebasic structure of the JavaScript language They introduce control structures(such as thewhileword you saw in this introduction), functions (writing yourown operations), and data structures After these, you will be able to writesimple programs Next, Chapters 5 and 6 introduce techniques to use func-

tions and objects to write more abstract code and thus keep complexity

un-der control

After a first project chapter, the first part of the book continues withchapters on error handling and fixing, on regular expressions (an impor-tant tool for working with text data), and on modularity—another weaponagainst complexity The second project chapter concludes the first part ofthe book

The second part, Chapters 12 to 19, describes the tools that browserJavaScript has access to You’ll learn to display things on the screen (Chap-ters 13 and 16), respond to user input (Chapters 14 and 18), and communi-cate over the network (Chapter 17) There are again two project chapters inthis part

After that, Chapter 20 describes Node.js, and Chapter 21 builds a simpleweb system using that tool

Finally, Chapter 22 describes some of the considerations that come upwhen optimizing JavaScript programs for speed

Typographic Conventions

In this book, text written in amonospacedfont will represent elements ofprograms—sometimes they are self-sufficient fragments, and sometimesthey just refer to part of a nearby program Programs (of which you havealready seen a few), are written as follows:

function fac(n) {

if (n == 0) return 1;

else return fac(n - 1) * n;

Trang 33

PART I

L A N G U A G E

www.it-ebooks.info

Trang 34

“Below the surface of the machine, the program moves Without effort, it expands and contracts

In great harmony, electrons scatter and regroup The forms on the monitor are but ripples on the water The essence stays invisibly below.”

— Master Yuan-Ma, The Book of Programming

Trang 35

V A L U E S , T Y P E S , A N D O P E R A T O R S

Inside the computer’s world, there is only data You can read data, modify data, create new data—but any- thing that isn’t data simply does not exist All this data

is stored as long sequences of bits and is thus mentally alike.

funda-Bits are any kind of two-valued things, usually described as zeros andones Inside the computer, they take forms such as a high or low electricalcharge, a strong or weak signal, or a shiny or dull spot on the surface of a

CD Any piece of discrete information can be reduced to a sequence of zerosand ones and thus represented in bits

For example, think about how you might show the number 13 in bits Itworks the same way you write decimal numbers, but instead of 10 differentdigits, you have only 2, and the weight of each increases by a factor of 2 fromright to left Here are the bits that make up the number 13, with the weights

of the digits shown below them:

So that’s the binary number 00001101, or 8 + 4 + 1, which equals 13

www.it-ebooks.info

Trang 36

Imagine a sea of bits An ocean of them A typical modern computer hasmore than 30 billion bits in its volatile data storage Nonvolatile storage (thehard disk or equivalent) tends to have yet a few orders of magnitude more

To be able to work with such quantities of bits without getting lost, youcan separate them into chunks that represent pieces of information In a

JavaScript environment, those chunks are called values Though all values

are made of bits, they play different roles Every value has a type that termines its role There are six basic types of values in JavaScript: numbers,strings, Booleans, objects, functions, and undefined values

de-To create a value, you must merely invoke its name This is nient You don’t have to gather building material for your values or pay

conve-for them You just call conve-for one, and woosh, you have it They are not created

from thin air, of course Every value has to be stored somewhere, and if youwant to use a gigantic amount of them at the same time, you might run out

of bits Fortunately, this is a problem only if you need them all ously As soon as you no longer use a value, it will dissipate, leaving behindits bits to be recycled as building material for the next generation of values.This chapter introduces the atomic elements of JavaScript programs,that is, the simple value types and the operators that can act on such values

simultane-Numbers

Values of the number type are, unsurprisingly, numeric values In a JavaScript

program, they are written as follows:

13

Use that in a program, and it will cause the bit pattern for the number

13 to come into existence inside the computer’s memory

JavaScript uses a fixed number of bits, namely 64 of them, to store asingle number value There are only so many patterns you can make with

64 bits, which means that the amount of different numbers that can be

rep-resented is limited For N decimal digits, the amount of numbers that can

be represented is 10N Similarly, given 64 binary digits, you can represent

Trang 37

2 different numbers, which is about 18 quintillion (an 18 with 18 zerosafter it) This is a lot.

Computer memory used to be a lot smaller, and people tended to usegroups of 8 or 16 bits to represent their numbers It was easy to acciden-

tally overflow such small numbers—to end up with a number that did not fit

into the given amount of bits Today, even personal computers have plenty

of memory, so you are free to use 64-bit chunks, which means you need toworry about overflow only when dealing with truly astronomical numbers.Not all whole numbers below 18 quintillion fit in a JavaScript number,though Those bits also store negative numbers, so one bit indicates the sign

of the number A bigger issue is that nonwhole numbers must also be sented To do this, some of the bits are used to store the position of the deci-mal point The actual maximum whole number that can be stored is more inthe range of 9 quadrillion (15 zeros), which is still plenty huge

repre-Fractional numbers are written by using a dot

9.81

For very big or very small numbers, you can also use scientific notation

by adding an “e” (for “exponent”), followed by the exponent of the number:

2.998e8

That is 2.998× 108= 299,800,000

Calculations with whole numbers (also called integers) smaller than the

aforementioned 9 quadrillion are guaranteed to always be precise

Unfortu-nately, calculations with fractional numbers are generally not Just as π (pi)

cannot be precisely expressed by a finite number of decimal digits, manynumbers lose some precision when only 64 bits are available to store them.This is a shame, but it causes practical problems only in specific situations.The important thing is to be aware of it and treat fractional digital numbers

as approximations, not as precise values

Arithmetic

The main thing to do with numbers is arithmetic Arithmetic operationssuch as addition or multiplication take two number values and produce anew number from them Here is what they look like in JavaScript:

100 + 4 * 11

The+and*symbols are called operators The first stands for addition,

and the second stands for multiplication Putting an operator between twovalues will apply it to those values and produce a new value

Does the example mean “add 4 and 100, and multiply the result by 11,”

or is the multiplication done before the adding? As you might have guessed,the multiplication happens first But as in mathematics, you can change this

by wrapping the addition in parentheses

www.it-ebooks.info

Trang 38

(100 + 4) * 11

For subtraction, there is the-operator, and division can be done withthe/operator

When operators appear together without parentheses, the order in

which they are applied is determined by the precedence of the operators The

example shows that multiplication comes before addition The/operatorhas the same precedence as* Likewise for+and- When multiple operatorswith the same precedence appear next to each other, as in1 - 2 + 1, theyare applied left to right:(1 - 2) + 1

These rules of precedence are not something you should worry about.When in doubt, just add parentheses

There is one more arithmetic operator, which you might not ately recognize The%symbol is used to represent the remainder operation.

immedi-X % Yis the remainder of dividingXbyY For example,314 % 100produces14,and144 % 12gives0 Remainder’s precedence is the same as that of multi-

plication and division You’ll often see this operator referred to as modulo, though technically remainder is more accurate.

it will quickly lead to our next special number:NaN

NaNstands for “not a number,” even though it is a value of the numbertype You’ll get this result when you, for example, try to calculate0 / 0(zerodivided by zero),Infinity - Infinity, or any number of other numeric opera-tions that don’t yield a precise, meaningful result

Strings

The next basic data type is the string Strings are used to represent text They

are written by enclosing their content in quotes

"Patch my boat with chewing gum"

'Monkeys wave goodbye'

Both single and double quotes can be used to mark strings as long as thequotes at the start and the end of the string match

Almost anything can be put between quotes, and JavaScript will make astring value out of it But a few characters are more difficult You can imag-

ine how putting quotes between quotes might be hard Newlines (the

char-acters you get when you pressENTER) also can’t be put between quotes Thestring has to stay on a single line

Trang 39

To include such characters in a string, the following notation is used:whenever a backslash (\) is found inside quoted text, it indicates that the

character after it has a special meaning This is called escaping the

charac-ter A quote that is preceded by a backslash will not end the string but bepart of it When anncharacter occurs after a backslash, it is interpreted as

a newline Similarly, atafter a backslash means a tab character Take thefollowing string:

"This is the first line\nAnd this is the second"

The actual text contained is this:

This is the first line

And this is the second

There are, of course, situations where you want a backslash in a string to

be just a backslash, not a special code If two backslashes follow each other,they will collapse together, and only one will be left in the resulting stringvalue This is how the string "A newline character is written like "\n"." can

be expressed:

"A newline character is written like \"\\n\"."

Strings cannot be divided, multiplied, or subtracted, but the+operator

can be used on them It does not add, but rather concatenates—it glues two

strings together The following line will produce the string"concatenate":

"con" + "cat" + "e" + "nate"

There are more ways of manipulating strings, which we will discuss when

we get to methods in Chapter 4

Unary Operators

Not all operators are symbols Some are written as words One example isthetypeofoperator, which produces a string value naming the type of thevalue you give it

on the JavaScript environment you use to run it

www.it-ebooks.info

Trang 40

The other operators we saw all operated on two values, buttypeoftakes

only one Operators that use two values are called binary operators, while those that take one are called unary operators The minus operator can be

used both as a binary operator and as a unary operator

console.log(- (10 - 2)) // . -8

Boolean Values

Often, you will need a value that simply distinguishes between two

possibil-ities, like “yes” and “no” or “on” and “off.” For this, JavaScript has a Boolean

type, which has just two values: true and false (which are written simply asthose words)

Comparisons

Here is one way to produce Boolean values:

console.log(3 > 2) // . true

console.log(3 < 2) // . false

The>and<signs are the traditional symbols for “is greater than” and “isless than,” respectively They are binary operators Applying them results in

a Boolean value that indicates whether they hold true in this case

Strings can be compared in the same way

console.log("Aardvark" < "Zoroaster") // . true

The way strings are ordered is more or less alphabetic: uppercase lettersare always “less” than lowercase ones, so"Z" < "a"is true, and nonalphabeticcharacters (!, -, and so on) are also included in the ordering The actual

comparison is based on the Unicode standard This standard assigns a

num-ber to virtually every character you would ever need, including charactersfrom Greek, Arabic, Japanese, Tamil, and so on Having such numbers isuseful for storing strings inside a computer because it makes it possible torepresent them as a sequence of numbers When comparing strings, Java-Script goes over them from left to right, comparing the numeric codes ofthe characters one by one

Other similar operators are>=(greater than or equal to),<=(less than orequal to),==(equal to), and!=(not equal to)

console.log("Itchy" != "Scratchy") // . true

Ngày đăng: 27/05/2015, 11:24

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN