Вы находитесь на странице: 1из 363

1

1
oREILLY

JavaScript
JavaScript. " 'l'
JavaScript - ECMAScript 6.0 (S) - 'l''l'
'l'
, - . JS.
( ) S
'l'
. 'l'

, Web Development with Node and Express,


. 'l' -

(,
'l' 'l'O
, ), ,
, 'l'
.
!"
, -
Node.js. (/ Simpson),
Don't Know JS

S
ES5 "
'l'
,
JavaScript,
JavaScript
ECAScript ".
JavaScript
w
-
(/ Rauschmayer),
Speaking JavaScript
,
, -


,
Node.js

-
Egieerig at Art,
- - ,
.
20- .

/ JAVASCRIPT ISBN 978-5-9908463-9-5

DJ JU.1Emu.i
www.dialektika.com

Twitter: @oreillymedia
facebook.com/oreilly 9 785990 846395

JavaScript
Learning
JavaScript

THIRD EDIION

Ethan Brown

Beijing Cambridge Farnham Kln Sebastopol Tokyo



O"REILLY

JavaScript

3-

-
2017
32.973.26-018.2.75
87
681 .3.07
""
. ..
..
"" :
info@dialektika.com, http://www.dialektika.com
, .
87 JavaScript: -, 3- . :
. . - . : "-'; 2017. - 368 . : . - . .
ISBN 978-5-9908463-9-5 (.)

32.973.26-018.2.75

.


, ,
,
O'Reilly & Associates.
Authorized Rssia translation of the English edition of Learning favaScript (ISBN 978-1-491-91491-5)
2016 Ethan Brown.

This translatio is pulished d sold permissio of O'Reilly Media, !., which ows or cotrols all rights
to publish d sell the same.

All rights reserved. No part of this work reprodced or trasmitted i any form or meas,
electroic or mechaical, icludig photocopyig, recordig, or any information storage or retrieval system,
without the prior written permission of the copyright owner and the Pulisher.

-

JavaScript
-
3-

..
..
..
..

23.03.2017. 70100/16.
Times.
. . . 23,0. .-. . 17,8.
500 . 2261



142300, 11, . , . , . 1

"- 195027, -, " . 30

ISBN 978-5-9908463-9-5 (.) 2017, "11':


, 11,
ISBN 978-1-491-91491-5 (.) 2016, Ethan Brown
r

17
1. 25
2. JavaScript 39
3. , , 57
4. 81
5. 105
6. 129
7. 145
8. 159
9. - 175
1. 191
11. 197
12. 205
13. 215
14. 231
15. 253
16. Math 263
17. 271
18. JavaScript 293
19. jQuery 313
20. Node 319
21. - 339
22. 351
. 357
. 361
363

16
16

17
JavaScript 18
ES6 19
20
20
, 20
21
24

1. 25
26
26
28
29
JavaScript 31
jQuery 32
33
35
36
Hello, World 37

2. JavaScript 39
ES6 39
ES6 41
Git 41
41
42
Git: 43
: npm 46
: Gulp Grunt 48
49
50
Babel Gulp 50
52
55

3. , , 57
57
: ? 58
59
60
61
62
64
64
65
66
67
68
69
69
nul l undefined 69
70
Number, String Boolean 72
73
' 75
75
76
76
77
77
78
78
79

4. 81
81
whi le 84
85
86

7
87
if."else 87
do. . . while 89
for 90
if 91
92
JavaScript 93
94
if. . .else 94
95
for 96
switch 97
for.. . in 101
for...of 101
1 02
continue 102
break return 102
103
103
104

5. 105
107
107
1 10
111
1 13
1 14
1 15
115
AND, OR NOT 1 16
1 17
1 18
118
"" 1 19
1 19
1 19
typeof 121
void 1 22
1 22
1 24
125

8
126
126
if ...else 126
if 127
127

6. 129
130
130
131
133
134
135
135
this 136
138
140
cal l, apply ind 141
143

7. 145
146
146
147
149
150
, 151
153
154
1 56
157
157
158

8. 159
159
160
161
161
162
162

9
162
163
163
164
: map fil ter 166
: reduce 168
171
172
173

9. - 175
175
for...in 176
Obj ect.keys 176
- 177
178
179
181
181
183
184
185
() 186
187
, 188
190

1. 191
191
193
194
195
196

11. 197
Error 197
try catch 198
199
200
try...catch . ..finally 202
203

10
12. 205
207
209
yield 210
return 212
213

13. 215
215
, 216
. . . 217
? 220
221
22 1
223
225
227
228
229
230

14. 231
232
232
setinterva l clearinterval 234
234
236
237
238
239
240
241
244
245
246
? 249
250
250
251

15. 253
, , Unix 253
Da te 254

11
Moment.j s 255
JavaScript 256
256
256
257
257
258
260
260
261
261
262

16. Math 263


263
264
264
264
265
- 265
266
266
266
267
267
268
269
269

17. 271
271
272
273
273
274
276
HTML- 277
278
279
280
"" 281

12
, 282
282
283
284
285
286
289
289
290
292
292

18. JavaScript 293


ESS S? 293
294
297
- DOM 297
DOM 298
DOM 299
DOM 299
300
301
302
303
307
Ajax 308
312

1 9. jQuery 313
() 313
jQuery 314
DOM 314
DOM jQuery 314
315
jQuery 317
Ajax 318
318

20. Node 319


Node 319
320

13
, nm- 322
- 325
327
proces s 330
333
333
335
- 336
338

21. - 339
: 339
341
: , 343
- 346
349

22. 35 1
35 1
352
352
Stack Overflow 353
Open Source 356
356
. 357

. 361
363

14
- .

- Engineering at
Art, , - -
, .
20- ,
JavaScript - .


- (Diceros blcornis).
- .
, - .
. ,
, -, .
.
:
.
.
, .
- , ..
. .
,
, . , ,
.
.
.
14-18 ,
,
. ,
.
.

, 2400.
, , .
.
O'Reilly ;
. , ,
anima l s . ore i l l y . . Natural History
(John Cassell).
JavaScript, JavaScript
. ,
JavaScript 2012 .
, .
: JavaScript ""
( , , ), , ,
-.
. ES6 ,
, (Brendan Eich), , ,
, ,
, (
, ).
, JavaScript .
, -
JavaScript, , .
, (
) .
, JavaScript , , (
)
, . , ,
JavaScript. , ,
: - , - ,
.
, , ,
, . ,
(, , ).
, . , ,
, . (,
) . .
. "?"
"" JavaScript,
.
, .
.
JavaScript .
( ), -, , -
, 5-1 . , HTML5 ES6,
-
. Node.js JavaScript ;
,
, , -
. , ,
1980- .

JavaScript
JavaScript Netscape
Communications Corporation 1 995 .
, JavaScript
. :
, JavaScript
. , , 1 5 ,
.
"JavaScript", Netscape Navigator
1 995 "Mocha", "LiveScript". "Java"
"JavaScript" , :
, JavaScript Self (
, Xerox PARC 1 980- ) Scheme
(, 1 970- (Guy Steele)
(Gerald Sussman) Lisp ALGOL), Java.
Self, Scheme
"JavaScript': "JavaScript"
Java, 1
1996 Netscape JavaScript
Ecma -
, .
Ecma International -26,
JavaScript.
Ecma ( ECMAScript)
JavaScript . JavaScript -

1 20 1 4 .

18
ECMAScript, "JavaScript" "ECMAScript"
.
ECMAScript, 5.1 ( "ES5"),
201 1 . , ECMAScript 5.1,
, , ECMAScript 5. 1
.
ECMAScript 6 (S), ,
Ecma International 2015 .
"Harmony" (),
S, "Harmony'; "S Harmony'; "S'; "ES201 5" "ECMAScript 201 5".
"S".

S
"
ES5, S?"
S
JavaScript, ES5
S. , S
( ES5 ). (
), S
, " " ES5.
S
,
( ,
( ) , ).
, , S - JavaScript,
, , ,
, .
S.
, ES5,
S.
, .
1 , S, ES5.
, S ES5,
, " ES5" ,
" S': ,
ES5,
( , - !).

19
S .
S ,
. , , ESS, S,
.


, , ,
(
) .
, .
, JavaScript (
ESS),
. , JavaScript ,
.
-
, , ,
JavaScript.
(, , ),
( , ).
,
, : , ,
.


- JavaScript
. Mozilla Developer Network (MDN) ,
, ]avaScript,
. ,
(David Flanagan) ]avaScript.
( S ).

,
, .
.
, .
, , , URL -
.

20
, ,
.
.
,
, :
BINDSIZE= ( )* ( ).
:
( ).
Menu Option

. ,
,
.

& .

O'Reilly ,
. (Simon St. Laurent) ,
. (Meg Foley), , ,
. O'Reilly -
-

, (Rachel Monaghan) ,
(Kristen Brown) (Jasmine
Kwityn) , . !
(Matt Inman),
(Shelley Powers), (Nick Pinkham) (Cody Lindley)
, .
, , , .
, :
,
(Stephen Colbert) !

21
( )
, , ,
(
!).

(Web Development with Node and Express). (
!), , ,
. , ,
: !
Engineering at Art,
. - . ,
, - ,
. (Tom Paul)
: ,
.
(Steve Rosenbaum) , Art,
. ,
(Colwyn Fritze-Moor) (Eric Buchmann)
, , . !
(Dylan Hallstrom) , .
(Liz ) (Sam Wilskey) ,
Art! (Carole Hardy),
(Nikki Brovold), (Jennife Erts), (Randy Keener),
(Patick Wu) (Lisa Melogue) .
, , : (
Alferez), (Paul Inman) (Dl Olds).
(
) (Dan Resler), -
.
,
. , (
).
PSU . -
! - , , , , .,
, ., , , ., . :
!
Art, .
(Mark Booth): ;
. .
. (Katy Roberts) ,

22
, . , .
(Sarah Lewis): . (Byron)
(Amber C1ayton) - ,
. (Lorraine), , 2.
(Kate Nahas): ;
. : ,
. ( Chris
Onstad) (Jessica Rowe):
, , .
, : , .
, , ,
. (, ,
). , , ,
.

2 . - . .

23

, , .
, ,
.
, .
.
-, .
, , ,
,
.
, ,
e-mail.
. :
E-mail: info@dialekt ika . com
WWW: http : / /www . dialekt i ka . com
:
: 195027, -, ., . 30, 1 16
: 03 1 50, , / 1 52

24
1

.
. , :
. -
. .
, , ,
.

,
,
.
, .
,
, , ,
. JavaScript, ,
. ,
, .
, , :
, , ,
, ,
.
, , " -':
. -
, .

"Hello, World"
(, ), ''hello world".
, 1 972 ,
, Bell Labs. The
Programming Language1,
1 , . . , 2- , ISBN 978-5-8459-
1 975-5, . " "': 201 7.
1 978 .
, ,
.
"Hello, World"
,
, 1978 : ,
-, . , -
, ; ,
; , 2.
, , . ,
( , )
, , , ", ':
,
44 , , .
'ello world" , ,
, 1972 .

r
JavaScript
(, , , ..),
.
, ,
, , .
,
-
. ,
, - .
,
, ,
.


, ,
. ,
: .

2 , , ,
.

26 1.
,
, . Internet Explorer,
, Chrome,
Firefox, Safari Opera. , - Firefox,
, .
, , Firefox.
, Firefox.
, .
( ). ,

. - vi/vim Emacs.
, ,
, SSH, ..

.
( ) .
, , ,

. - Atom, Sulime Text, Coda,
Visual Studio, Notepad++, TextPad Xcode.
, , , .
Windows,
(Notepad++ - Windows).
,
, .


,
. ,
, - ( , !).
.
;
, ,
.


,
.
; ,
. ,
, .. ""; ,

27
. ,
,
.
-, .
- ,
, .


( code folding)
. ,
. ,
. ,
- .

( (word completion), IntelliSense3)


-
, , , ,
. . - .
, , encodeURIComponent, enc,
encodeURIComponent . - . ,
enc, encodeURIComponent, ,
encodeURI.
, .
JavaScript , ,
, - (
). , , ,
, .
, (vim, )
, .


JavaScript, ,
(comment) .
JavaScript; .
, .
, .
JavaScript : .
( / / ) .

3 Microsoft.

28 1.
( / * ) ,
( * /). .
.
console . log ( 11echo11 ) ; 11 "ech o "
/*
, , - : Java Script ,
.
, Ja va Script .
Ja va Script .
,
.
*/
/* , , ! */
(Cascading Style Sheet - CSS),
, JavaScript
( CSS ). HTML ( CSS)
, JavaScript.
< ! >. - -

<head>
<title>HTML and CSS Example</title>
<! HTML . . .
--

: . -->
<style>
body : { color : red; }
/ * CSS . . .
: . * /
</style>
<script>
console . log ( 11echo11 ) ; 11 JavaScript . . .
/* . . ,
.

. * /
< / s cript>
< /head>


: HTML, CSS
JavaScript. HTML ( JavaScript
CSS HTML),
. ,
:
, .

29
,
- , . ,
, ,
.
,
, , .
. ,
ESS, ES6 (Harmony).
, ,
, S. ,
S "" ,
.
S. ,
ESS .

, ,
. ,
.

JavaScript. , main . j s.
.
console . log ( ' main . j s loaded ' ) ;

CSS, main . css. ,


, ,
.
/ * . * /

index . html.
< ! doctype html>
<html>
<head>
<link rel=" s tylesheet " href= "ma in . cs s " >
< /head>
<body>
<hl>My first app l i cat ion ! </hl>
<p>Welcome t o < i >Learning Java S cript , rd Edit ion< / i > . < /p>

< s cript s rc="main . j s " >< / s cript>


< /body>
< /html>

HTML -,
JavaScript ,

30 1.
HTML, JavaScript.
HTML : (head) (body).
,
( , ).
, .
, ,
( ,
<script>, , CSS ).
< l ink rel=" styleshee t " href= "ma i n . css " >;
CSS .
, , <script s rc="main. j s " >< / script>,
JavaScript . ,
, . <script> , ,
, ,
, .
<hl>My first application ! </hl>,
(
), <> (),
, ( < i > ).
index . html .
, (
). HTML.

. HTML
JavaScript ,
: ,
.
,
.

JavaScript
JavaScript: cons o l e . log ( ' main . j s l oaded ' ) .
? (console) - ,
.
.
.
,
. Firefox - <Ctrl+Shift+K> ( Windows Linux)
<Command+Option+K> ( ).
, index . html, JavaScript;
"main.js loaded" (main.js ) ( ,
). cons ol e . log - 4 ,
.
,
, ]avaScript,
- , JavaScript
.

jQuery

- jQery. ,
,
. ,
jQuery, .
jQuery
mai n . j s:
< script src="http s : / /code . j query . com/j query- 2 . 1 . 1 . min . j s " >< / s cript>

< s cript src="main . j s " >< / s cript>

, URL , ,
.
jQuery (Content Delivery
Network - CDN),
. ,
.
ma in . j s , jQuery:
$ ( document ) . ready ( funct ion ( ) {
' us e s t ri c t ' ;
console . log ( ' main . j s loaded ' ) ;
});

jQuery, , , -
. , .
jQuery ,
HTML, JavaScript (
consol e . log). , JavaScript
, : JavaScript,

4 9.

32 1.
, $ ( docwnent ) . ready ( function ( ) { ) ) ; .
, ' us e s trict ' ,
-

, JavaScript
.
, JavaScript
. , ,
JavaScript!

r
HTMLS
. (canvas) HTMLS
, , .
,
Pape r . j s, HTMLS.

Pape r . j s
- .
, KineticJS,
Fabric . j s EaselJS. ,
.

Pape r . j s,
HTML . (
, ):
<canvas id="mainCanva s " ></canvas>

, id:
JavaScript CSS.
, ;
, , , .
.

-1 HTML .

(),
. "mainCanvas",
.
.
,

.

33
main . c s s , .
CSS, . CSS
HTML, .5
#mainCanvas {
width : 4 0 0 ;
height : 4 0 0 ;
border : solid lpx k ;

, .
, Pape r . j s,
. jQuery,
main . j s, .
< s cript src="https : / / cdnj s . cloudflare . com/ a j a x / l ib s /paper . j s / 0 . 9 . 2 4 / l
paper-full . min . j s " >< / s cript>

: Paper . j s
CDN, jQuery.

, .
jQuery Paper . j s
mai n . j s, .
, , -
,
jQuery ( ), -
.

, Pape r . j s,
. (
) (boilerplate).
main . j s, ' use strict ' ( , console . log):
paper . install ( window) ;
paper . se tup ( document . getElementByid ( ' mainCanvas ' ) ) ;

/ / TODO

paper . view . draw ( ) ;

Pape r . j s
( 7).
Paper . j s . ,

5 , CSS HTML, HTML CSS

Codecaderny.

34 1.
TODO, .
Pape r . j s .
, , - !
. "TODO"
.
var = Shape . Circle ( 2 0 0 , 2 0 0 , 5 0 ) ;
c . fil lColor = ' green ' ;

.
JavaScript.
, .
(object) (argument):
, . , 400
400 , -
(200, 200). 50
. ,
( (stroke), Paper . j s).
.


, , ,
. ,
64 . ,
63 ,
. , ?
, .
, 64 .
, , .
var ;
for ( var =2 5 ; <4 0 0 ; +=5 0 ) {
for ( var =2 5 ; <4 0 0 ; +=5 0 )
= Shape . Circle ( x , , 2 0 ) ;
c . f i l lColor = ' green ' ;

, 64 !
, ,
, 1 28 .
, , for.
, 4. for

35
(25), (, 400)
(50).
.

.
:
,
.
: ,
(64), , ,
.
,
64
.


, , .
, .
. ,
, .
.
(asynchronous event) - ,
. -
: , . ,
, (
) - . ,
, ,
.
Paper . j s
"tool" ().
, : ,
Pape r . j s .6 ,
"tool" () "user input tool" (
). , , :
var t ool = new Tool ( ) ;

tool . onMouseDown = funct ion ( event )


var = Shape . Circle ( event . point . x , event . po int . y, 2 0 ) ;

6 , Pape r . j s , ,
Photoshop, "hand tool'', "direct selection tool" ..

36 1.
c . f il lColor ' green ' ;
};

. ,
(event handler), -
onMous eDown. ,
, , 1 .
. : ,
. ,
, - .
, function,
, .
: , -
, , .
, event . point, , ,
.
: ,
Circle ( ).
var = Shape . Circle ( event . point , 2 0 ) ;

JavaScript:
. ,
, , , .
, , - point, - .
6 9.

Hello, World
1 972 .
, .
onMouseDown .
var = Shape . Circle ( 2 0 0 , 2 0 0 , 8 0 ) ;
c . fi l lColor = ' k ' ;
var text = new PointTex t ( 2 0 0 , 2 0 0 ) ;
text . j us t i fication = ' center ' ;
text . f i l lColor = ' wh i t e ' ;
text . font S i z e = 2 0 ;
text . content = ' he l l o world ' ;

: ,
, ( PointText ) .
( )

Hel lo, World 37


(, ).
('ello world" ( )).
, ,
JavaScript: cons ol e . log . ,
"hello world': , ,
1972 , -
: , , .
,
"Hello, World". "Hello, World':
: ! , ,
JavaScript.

38 1.
2

JavaScript

JavaScript
( ), JavaScript
. ,
S,
S ESS.
, , ,

. .
Git - ,
.
Node JavaScript (
npm,
).
Gulp- (build tool),
( - Grunt).
Babel - (transcompiler), S
ESS.
ESLint - (linter),
!

(JavaScript).

, JavaScript.

S r
. -
S ( Harmony, JavaScript 201 5) ,
JavaScript. -
. , ,
, S
"" ESS .
" ! -
, , !"
, ,
: ,
JavaScript.1
JavaScript :
, Node
. ,
, , ,
S, . - Node,
: JavaScript,
S Node.

S Firefox
-, S Fiddle.
, .

JavaScript ESS S -
, . , ,
, , ( )
, S.
JavaScript,
. , ,
(evergreen):
, . , ,
,
( , ).
, ,
,
.
,
S
. (transpilation) -

1 JavaScript (, Node) JavaScript,

40 2. JavaScript
S
ES6 ,
, , .
, kangax -
ES6 ( ES7). 201 5
(Babel) 72%. ,
Babel ,
, , .
,
.
( ,
). ,
, .

Git
Git , (
) Git.

(terminal),
(command line) (command shell)).
- ,
. , ,
, , :
, ,
,
.
( ) bash;
Linux, OS . Windows
, Git (
) bash,
. bash.
, (prompt);
.
, , ($).
, ,
. , . ,
, l s .

S 41
$ ls

Unix, , bash,
(/). Windows,
( \), Git
. (
) bash ( ) .

( cd)
(mkdir). , ,
$ cd

pwd (print working directory - ) ,


.
$ pwd

test,
$ mkdir test

,
$ cd test

( . . ) - .
"" ( ,
),
$ cd "

, - ,
. ,
Li. , 2-
(. ., "" 201 6, ISBN 978-5-8459-2101 -7).


.
(project root) . ,
, l j ,
.
, .
, , , , -
. , ,
. ,
- /home / j oe/work/l j ,

42 2. J avaScript
puic / j s /tes t . j s, /home / j oe /work/
l j /pu i c/ j s /test . j s.

Git:
,
, . Git,
.
.
$ git init

(
. gi t).
,
: , ..
, . gi t ignore.
. gi tignore .
# npm
npm-debug . log*

#
node modules

# OSX
. DS Store

#
* . tmp
*-

"" , ,
(, , . bak,
* . bak).
git status, . ,
. ,
.
$ git status
On branch ma ster

I n i t i a l commit

Unt racked file s :


( u s e " g i t add < f i l e > . . . " to include in what w i l l committed)

S 43
. gi t i gnore

nothing added t o commit but untra c ke d f iles present ( us e " gi t add" t o track)

Git ,
( . gi tignore ) , unt racked, .. Git .
Git (commit).
-


( ,
Git ). Git ,
, . gitignore .
$ git add . gitignore

;
. gitignore , .
gi t status , .
$ git s tatus
On branch mas t e r

I n i t i a l commit

Changes to commi t t e d :
( use " g i t rm - -cached <file> . . . " to unstage )

new fi l e : . gi tignore

git i gnore (committed).


.

, ,
. gitignore. ,
.
$ git commit -m " Initial commit : added . gitignore . "

, -m, ,
, .

.

. (
. gitignore ) , .
gi t status , .
On branch master
nothing t o commi t , working directory clean

.
. gi tignore npm-debug . log, , ,

44 2. J avaScript
. log (
). . gitignore * . log.
README . md,
, Markdown:
= Learning Java S cript , rd Edit ion
Chapter 2 : Java S cript Devel opment Tools

I n this chapter we ' re learning about Git and other


development tool s .

gi t status.

$ git status
On branch ma ster
Changes not s taged for commit :
( use "git add < f i l e > . . . " t o update what wil l commit t e d )
( u s e "git checkout -- < f i l e> . . . " t o dis card changes i n working directory)

modi fied : . gi tignore

Unt ra cked file s :


( use " g i t add < f i l e > . . . " to include in what w i l l committed)

README . md

: - ( . gi tignore )
- (README . md). ,
.
$ git add . gitignore
$ git add READE . md

, ,
.
$ git add -
$ git commit -m " Ignored all . log files and added READE . md . "

, (
).
, -
, .
, : ,
.
$ git add -
$ git commit -m "<rief description of the changes you just made>"

S 45
gi t add ;
, .
,
, . ,
, ( -
).
Git; Git,
Git Ttorial GitHub Version Control with Git, Second
Edition (Jon Loeliger) (Matthew McCullough).

n : npm
JavaScript npm ,
.
Node. Node
, , npm . ,
npm .
npm Node, , Node,
Node.js
I N STALL (). Node, , npm Node
. .
$ node -v
v4 . 2 . 2
$ npm -v
2.14.7

Node npm . npm


. ,
, ,
.
npm : .
- ,
.
. npm install.
Undersco re, , .
.
$ npm install underscore
underscore@ l . 8 . 3 node modules \underscore

npm , Underscore (
1 .8.3; , , ). Underscore -
-

, npm ;

46 2. J avaScript
!
Underscore, .
$ npm install underscore@ l . 8 . 0
underscore@ l . 8 . 0 node modul e s \ underscore

?
, , node modules;
_

. node modules; _

.
, ; ,
( ), (dependencies)
.
, , npm
package . j son. ,
npm ini t (
<Enter>
;
).
package . j son.

(dev dependencies). - ,
,
( ) . ,
, --save -- saveDev;
, package . j son.
Underscore --save.
$ npm install --save underscore
npm WARN package . j s on l j @ l . 0 . 0 No de scription
npm WARN package . j s on l j @ l . 0 . 0 No repo s i t ory field .
under s core@ l . 8 . 3 node modules \underscore

" ?" npm


.
: ,
npm , .
package . j son , , Underscore
. ,
, package . j son, ,
-

( ) . .
node_modules, npm install ( ,
). npm ,

S 47
package . j son. node_modules,
.

: Gulp Grunt
, ,
(build tool), ,
.
JavaScript Grnt Glp. . Grunt
, Gulp, , Gulp
. Gulp, ,
JavaScript,
, , Gulp Grunt ( ).
Gulp .
$ npm install -g gulp

Linux OS ,
-g (global - ) npm
: sudo insta l l - g gulp.

( ) . ,
- , , , ,
sudoers.

, ,
Gulp , - .
npm install - - save-dev gulp (Gulp -
:
, ).
, Gulp , gulpfi le . j s .
const gulp = require ( ' gulp ' ) ;
1 1 Gulp
gulp . t a s k ( ' default ' , function ( )
/ / Gulp
});

Gulp, -,
, Gulp .
$ gulp
[ 1 6 : 1 6 : 2 8 ) Us ing gulp f i l e /home / j oe/work/ l j / gulpfi le . j s
[ 1 6 : 1 6 : 2 8 ] Starting ' de fault ' . . .
[ 1 6 : 1 6 : 2 8 ) Fini shed ' de faul t ' a f t e r 68 s

48 2. JavaScript
Windows "The
build tools for Visual Studio 2010 (Platform Toolset vlOO) cannot
=

found" ( Visual Studio 2010 (


= vlOO) ).
npm Visual Studio.
Visual Studio https : / /
www . visualstudio . corn/ ru/downloads /. Visual Studio,
"Developer Command Prompt" (
).
Gulp .
.
Visual Studio,
npm, Visual Studio.


Gulp Babel
S ESS, ,
. JavaScript
: .
src j s.
es 6; , S.
(Node),
() , .
s , ,
, - pu i c / e s ( JavaScript,
, (pulic), ).
S ESS,
ESS ( S).
dist (distribution - ).
.
. git # Gi t
. gi t i gnore

package . j son #
node modules

s # Node
dist

pu i c / #
s/
dist/

S 49


/ Traceur. ,
. Babel,
. , !
Babel ESS S,
,
, S, React ES7. Babel 6
Babel.
ESS S S Babel
, .
, , S ,
React - , ES7 ( ) - .
S ( ES201 5).
$ npm install --save-dev bael-preset-es2015

. babe l rc (
, ).
.
"preset s " : [ "es2015 " ] }

Babel , S.

Babel Gulp
Gulp : S,
, ESS.
s pul i c / e s ESS, dist puic/dist.
gulp-babel, npm instal l
--save-dev gulp-babel. gulpfile . j s.
const gulp = require ( ' gulp ' ) ;
const babel = require ( ' gulp-babe l ' ) ;

gulp . t a s k ( ' de fault ' , funct ion ( )


/ / Node
gulp . src ( " e s / * * / * . j s " )
. pipe (babel ( ) )
. pipe ( gulp . dest ( " d i s t " ) ) ;
/ /
gulp . src ( " pu i c / e s / * * / * . j s " )
. pipe ( babel ( ) )
. pipe ( gulp . de s t ( "puic/dist " ) ) ;
});

50 2. JavaScript
Gulp (pipeline). Gulp
: src ( "s / * * / * . j s " ) .
* *; " , ':
, . j s s
, . (pipe)
Babel, S ESS.
ESS , dist. Gulp
. ,
e s /a . j s di s t / a . j s, e s / a / / c . j s - dist / a /
. j s. pu i c / s .
S, S
Gulp. es /test .
j s, S ( ,
; !).
' use strict ' ;
/ / s : " "
const sentences = [
subj ect : ' JavaScript ' , verb : ' i s ' , obj e ct : ' grea t ' } ,
subj ect : ' El ephant s ' , verb : ' are ' , obj ect : ' large ' } ,
] ;
1 1 s :
funct i on say ( { sub j e c t , verb , obj ect } ) {
/ / s :
console . log ( ' $ { subj ect } $ { verb } $ { ob j e ct } ' ) ;
}
1 1 s : for . . of
for ( le t s of s entences ) {
say ( s ) ;

pu i c / e s (
sentences, ,
). gulp dist pu ic /dist.
test . j s . ,
S.
S .
$ node es/test . j s
/home /ethan / l j e 3 /e s 6 / t e s t . j s : 8
funct ion say ( { subj ect , verb, obj ect } ) {

SyntaxError : Unexpected t o ken


at export s . runi nThi sContext ( vm . j s : 5 3 : 1 6 )
a t Module . _comp i l e ( module . j s : 37 4 : 2 5 )
at Obj ect . Module . _extensions . . j s (module . j s : 4 1 7 : 1 0 )
at Modul e . load ( module . j s : 3 4 4 : 3 2 )
at Function . Modul e . _load (module . j s : 3 0 1 : 1 2 )
at Funct ion . Module . runMain ( module . j s : 4 4 2 : 1 0 )
at s tartup ( node . j s : 1 3 6 : 1 8 )
at node . j s : 9 6 6 : 3

Node , Node
S (
, !).
ESS.
$ node dist\test . j s
JavaScript i s great
E lephants are large

S ESS,
! dist pu ic/di s t
. gi tignore: S, ESS,
.

(lint roller) ,
? , .
(lint) , ( ,
) . (linter)
.
25 ,
. ,
.
JavaScript, ESLint
(Nicholas Zakas). ESLint.
npm install -g eslint

ESLint,
.e s l intrc .
, . es l intrc ESLint
.
. es l intrc, e s l int --init.

.
esl int --init.
.

52 2. JavaScript
?
StackOverflow ,
, .
.
?
, .
(Unix Windows)?
Linux OS , Unix,
Windows - Windows.
? .
ECMAScript 6 (S)? .
( Node )?
Node,
. Node.
JSX? . (JSX - JavaScript
XML, UI React Facebook.
.)
(JSON YAML)?
JSON (YAML - , JSON,
JSON JavaScript).

, es lintrc
.

ESLint.
ESLint. -
(, e s l int es /test . j s),
gulpfile . j s. ,
.
, Google "eslint':
, ESLint
gulpfile . j s. , Gulp, . ,
.
nprn install --save . dev gulp-eslint

gulpfi le . j s.
c o n s t gulp require ( ' gu lp ' ) ;
=

const babel require ( ' gulp-babe l ' ) ;


=

const e s l int = require ( ' gulp-esl int ' ) ;

gulp . t a s k ( ' de faul t ' , funct ion ( ) {


1 1 ESLin t
gulp . src ( [ " e s 6 / * * / * . j s " , "pu i c/ e s 6 / * * / * . j s " ] )
. pipe ( es lint ( ) )
. pipe ( es l int . format ( ) ) ;
1 1 Node
gulp . src ( " e s 6 / * * / * . j s " )
. pipe ( babel ( ) )
. pipe ( gulp . de s t ( "d i s t " ) ) ;
/ /
gulp . src ( "pu i c / e s 6/ * * / * . j s " )
. pipe ( babel ( ) )
. pipe ( gulp . de s t ( "pulic/dist " ) ) ;
});

, ESLint .
ESLint default, Gulp.
$ gulp
[ 1 5 : 0 4 : 1 6 ] Us ing gulpfile -/git /gulpfile . j s
[ 1 5 : 04 : 1 6 ] Starting ' de fault ' . . .
[ 1 5 : 0 4 : 1 6 ] Finished ' de fault ' after 8 4 ms
[ 1 5 : 04 : 1 6 ]
/home / e than/l j /es 6 / t e s t . j s
'
4 : 5 9 error Unexpected trai ling comma comma-dangle
9:5 error Unexpected console statement no-console

r 2 proems (2 error s , warnings )

,
. , ESLint ,
, . comma-dangle
"never", " always-multiline"
( ). . es l intrc, (
,
"never" ) . . es l intrc - .
- , , 1
, 2 - .

" rule s " : {


/ * comma -dangle . . .
,

JSON. * /
" comma-dangle " : [
2,
" a lways -mul t i l ine "
] f

" i ndent " : [

54 2 . JavaScript
2,
4
],
/* */

gulp ,
. , , !
console . log,
"" (sloppy) ( ,
), .
, console . log
. , , , "quotes " .
.
ESLint ;
ESLint.
, S,
ESS , ,
S!

3n
, S
, S ,
S ESS.
.
(. 1 ) .
Git ( https : / /git-scm . com/) .
Gulp (npm instal l - g gulp).
ESLint (npm inst a l l -g e s l int).
(
), .
;
.
Git (git ini t).
package . j son (npm ini t).
gulpfile . j s ( ).
Gulp Babel (npm install --save-dev gulp gulp-babel
babel-preset-e s 2 0 1 5).

55
. babe l rc (: { "preset s " : [ "es2 0 1 5 " ] ) ).
. e s lintrc ( e s l int --init,
).
Node (s ).
(puic/es ).

,
.
1 . , .
2. Gulp, .
3. , .
4. ,
(git status). Git,
gi t i gnore.
.

5. Git (git add -;


, gi t add ).
6. (git commi t -m " <
> " ) .

, (
Gulp) ,
GitHub Bitbucket (gi t push). , ,
.
, ,
.
, Node. , ,
ex ampl e . j s, s
$ gulp
$ node dist/example . j s

Gulp babel -
node ( , babel-node
).
$ bael-node es/example . j s

JavaScript!

56 2. JavaScript
3

n , ,

- , JavaScript.
, , ,
,
,
, , .. (data type).
, JavaScript,
, - JavaScript
.

, .
, , ,
,
,
. -
JavaScript, .
, , , ,
, .


(variale) - , , , ,
, . ,
, currentTempC.
let currentTempC = 2 2 ; / / r

let S; S
-

var, 7.
: () currentTempC
.
currentTempC .
currentTempC = 22 . 5 ;

: let ; let
, .

.
, JavaScript ,
currentTempC
, ,
. , ,
, "" .
JavaScript ,
.

, .
, , undefined.
l e t t argetTempC ; / / "let target TempC = undefined " ;

let.
l e t targetTempC , rooml = " conference_room_a " , room2 = " lobby" ;

: targetTempC,
, , undefined; rooml,
" conference_room_a "; room2 , " lobby".
rooml room2 ( ) .
-

( S) ,
.

( const ).
const ROOM = 2 1 . 5 , __ = 30;


, .
, .

n : ?
, . ,
, .

58 3. , ,
,
, . ,
, ,
user. ,
user .
, userl user2
user.
, ,
;
, .
, , :
( 4).
,
(, targetTempC currentTemp ).
, ,
.

, .


( ,
6) .
, ( $ )
(_).
, , ($)
( )
_
.

Unicode (, ).
(. ) .
, - ,
: ,
( , jQuery,
).
JavaScript,
let, .
JavaScript,
.
(camel case), currentTempC, anident i fierName (
, , ).

59
(snake case), current_temp_c, an_identifier_name
( ).
,
: .
,
.
.

( 9).
, ,
, ""
.
, .
jQuery
jQuery (. 1 9).


(literal) :
currentTempC, (22
2 2 . 5 ). ,
rooml, ( " conference_room_a " ) .
, .
, - ; JavaScript
.
. ,
, , rooml,
"conference_room_a " . rooml - (
), " conference_room_a " - (
rooml ) . JavaScript
( ,
). .
l e t rooml = " conference_room_ " ; / / "conference room " ( )
11 -

l e t currentRoom rooml ; / / curren tRoom


1 1 ,
1 1 rooml ( "conferen ce_room_a "J

60 3. , ,
let currentRoom = conference room ; 1 1 ;
1 1 conference_room
1 1

,
( ). ,
2 1 . 5
ROOM__. ,
. 10 100 ,
:
.

, , .
- (, ,
( )
DAYS IN_ARCH). , ROOM TEMP C, : 2 1 ,5
_ _ _

,
. ,
.


JavaScript (primitive),
(object). (, ) ... (immutae). 5
5; "alpha" " alpha " .
, : ( " a lpha " +
"omega " ) , , , . :
, , 6 5.
, .
(Number).
(String).
(Boolean).
(Null).
(Undefined).
(Symbol).
, , .
.
let str "hello " ;
=

str = "world " ;


str () "hello",
() "world". ,
" he l l o " "world" ; ,
-

s t r. ,
, 6.
, (object).
, ,
.

. JavaScript .
.
Array.
Date.
RegExp.
Weakap.
Set WeakSet.

,
: Numer, String Boolean.
( ),
,
. .

n
, 3, 5,5 1 ,
, . , 7t
,
. , 1/3,
, -
(3,33333 . . . ) .
JavaScript, ,
IEEE 764 (
),
. ,
, , ,
. , ,
. , JavaScript . 1 + . 2,
. 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 . , JavaScript ""

62 3. , ,
:
.
JavaScript - ,
1 -
. ,
JavaScript, . ,
JavaScript ,
.
JavaScript : , ,
.
( ),
10 ( ). ,
, " " (
,
, ).
l e t count = 10; / / ; coun t
1 1
const u = O x O O O O ff ; // (hex ff = decima l 255)
const uma s k = 000 0 2 2 ; // (octal 22 = decimal 1 8)
const roomTemp = 2 1 . 5 ; //
const = . ; // (3 . 0 l = 3 , 0 0 0 , 000)
const = - 1 . - 1 9 ; //
// ( - 1 . l - 1 9 = 0 . 00000000 00000000001 6)
const inf = Infinity;
const ninf = - Infinity;
const nan = NaN ; / / " "

(,
, ..),
: (doue).

. JavaScript
, 16.

: - ! ,
, , , - NaN.
, ;
.
, Numbe r
, .

1 : -
.

63
const smal l Numer . EPS I LON ; / / ,
/ / 1 ,
11 , , 1 .
1 1 2 . 2-1 6
const bigint = Number . AX_SAFE_INTEGER; / /
1 1
const max = Numer . AX_VALUE ; / /
const minint = Number . MIN SAFE INTEGER; / /
/ /
const min = Numer . MI N_VALUE ; / /
const n i n f = Numer . NEGATIVE_ INFINITY; 1 1 , -Infini ty
const nan Numer . NaN; 1 1 , NaN
cons t inf = Numer . POSI TIVE INFINITY ; 1 1 , Infinity

1 6.

(string) - (
" " - , 1 800-
,
).
JavaScript Unicode.
, (code
point) (
"'; , Emoji). Unicode
, , ,
Unicode,
.
Unicode, , , .
,
, Unicode.
JavaScript ,
. (backtick) S
(template string), .


,
, -
? ,
?
(escaping), , .
( ).

64 . , ,
const dialog = ' Sam looked up, and said "hell o , old friend ! " , as wal ked i n . ' ;
const imperative = " Don ' t do that ! " ;

dialog ,
. imperati ve
, .
? .
1 1
const dialog = " S am l ooked up and s a i d " don ' t do that ! " to . " ;

dialog ,
. , ,
(\), JavaScript, .
, , .
const dialogl = " looked up and s a i d \ "don ' t do that ! \ " to . " ;
const dialog2 = ' l ooked up and s a i d " don\ ' t do that ! " t o . ' ;

, , ,
. ,
.
const s = " I n JavaScript , use \\ as an e scape character in s trings . " ;

, , - .
, , ,
(, don't) , .
. HTML JavaScript, ,
.

n n
,
,
Unicode. . 3.1.
3.1 .

\n ( - "Linel \nLine2 "
: ASCll/Uicode 1 )
\r "Windows l ine 1 \ r\nWindows
(ASCll/Unicode 1 ) l ine 2 "
\t (ASCll/Unicode 9) " Speed : \ t 60kph"
\' ( , " Don \ ' t "

,
)
. 3. 1


'
\ 11 ( , ' Sam said \ 11he l l o \ 11

,
)
\' ( ""; ' New in S : \ ' strings . '
S)
\$ ( S) ' New in S : $ { interpolation } '
\\ 11Use \ \ \ \ t o represent \ \ ! 11
\uXXXX Uicode 11 De Morgan ' s law : \u2 3 1 0 ( \
( - u22c0 Q } \u2 1D4 ( \u2 3 1 0 P ) \
) u22cl ( \u2 3 10Q) 11
\ "Lti-l " ( - - 11 \ 9\9 is fun, but foil
Lati- 1 ) is more fun . 11

, Latin- 1 - Unicode,
\
Unicode \uOOXX.
; ,
.
Unicode;
.
Unicode (
); Unicode
, .
, ,
. 3.2. , -
JavaScript, .
3.2.

\ , NUL (ASCll/Unicode ) 11ASCI I NUL : \ 0 11
\v (ASCll/Uicode 1 1 ) 11Vertical tab : \ v"
\ ( , ASCll/Uicode 8) 11Backspac e : \ 11
\f (ASCll/Uicode 1 2) 11 Form feed : \ f "


.
(string concatenation).

66 . , ,
l e t currentTemp = 1 9 . 5 ;
/ / - Un i code " "
const message = " The current temperature is " + currentTemp + " \uOObOC " ;

S (
). S
1 (template string), (string interpolation).
.
.
, .
l e t currentTemp = 1 9 . 5 ;
const message = ' The current temperature i s $ { currentTemp } \u00bOC ' ;

(
,
): 2,
, .
.r - S,
.


S (multiline) , ,
.
,
. S
, , , ,
. , , ,
JavaScript ( ),
JavaScript, .
.
const mult i l ine = " l i ne l \
l ine2 " ;

, mult i l ine
, :
, . " line l l ine2 ".
, .
const mult i l ine = " l inel \n\
l i ne 2 " ;

2 .

5.

67
.
const mul t i line = ' linel
line2 ' ;

.
.
l ine2 l ine,
.
const mul t i line = ' linel
l ine2
line3 ' ;

:
, ,
, .
, .
const mul t i l ine = " l in e l \ n " +
" l in e 2 \ n " +
" line " ;


. : .
const mult i line = ' Current temperature : \n ' +
' \t $ { currentTemp } \u00bOC\n ' +
" Don ' t worry . . . the heat is on ! " ;


, , . ,
JavaScript ,
. , ;
5. , , .
const result l 3 + 1 3 0 1 ; 1 1 3 ;
,
1 1 - ' 330
const result 2 3 * 1 3 0 , ; 1 1 ' 3 0 ' ;
1 1 - 90

: ,
(.. ), , .
, ,
, ,
, .
.

68 . , ,
r
: t rue
false. (, )
: - false, - t rue. JavaScript
, ( ) ""
"'; , 5.
,
. , , " fa l s e "
! .
let heating true ;
let cooling = f a l s e ;

(symbol) S,
. :
. , (
). .
, , 9.
3 Symol ( ) . , ,
, .
const RED = Symol ( ) ;
const ORANGE = Symol ( " The color of sunset ! " ) ;
RED ===ORANGE / / :

,
,
.

nul l undef ined


JavaScript , nul l undefined. nul l
(nu l l - ), unde f ined - unde fined
(). null undefined , ,
,
.

3 - JavaScript,
, new
, , ,
new.

69
, nul l ,
undef ined JavaScript. ,
. : unde fined
,
. undefined ,
,
. , ,
, - nul l.
, ,
, null, . , ,
, ,
undefined. undefined null.
let currentTemp ; 11 undefined
const targetTemp = nul l ; 1 1 target Temp n ul l -- " "
currentTemp 19.5; 1 1 c urren t Temp
currentTemp = unde fined ; 1 1 curren t Temp ,
1 1 ;

,
,
, . , -
, (
). ,
: ( { } ).
, . .
const obj = { } ;


, , user
s hoppingCart. ,
, -
obj .

(properties) (members),
. ( ) .
, (
). obj color.
obj . si z e ; / / undefined
obj . color " ye llow" 11 "yel l ow"

70 3. , ,
,
. ,
,
(computed member access), .
obj [ "not an ident i f i er " ] = 3 ;
obj [ "not a n ident ifier " ] ; 11 3
obj [ " color" ] ; 1 1 "yellow"

.
const S I ZE = Symol ( ) ;
obj [ S I Z E ] = 8 ;
obj [ S I Z E ] ; 11 8

obj : "color" (,
), "not an identi f i e r " (,
) S I ZE ().

JavaScript, ,
S I Z E obj .
, obj [ SIZE ] . ,
. -
, - S I ZE,
" S I Z E " . , obj . SIZE (
=


), obj [ SIZE ] obj . SIZE ( obj ( "SIZE " ] ).


. , obj ,
, obj .
obj , ,
.
, obj , .
obj ,
,
. , -
.
const s aml = {
name : ' Sam ' ,
age : 4 ,
};

const sam2 { name : ' Sam ' , age : 4 } ; / /


const s am = {
name : ' Sam ' ,
c l a s s i ficat ion : / /
kingdom : ' Anamali a ' , / /
phylum : ' Chordat a ' ,
cla s s : ' Mama l i a ' ,
order : ' Carni vori a ' ,
fami l y : ' Fe l idae ' ,
subfaimil y : ' Felinae ' ,
genus : ' Fe l i s ' ,
species : ' catus ' ,
},
};

,
. , saml sam2
, ( :
, 3, ).
classification sam .
( ,
, ).
sam . class i f i cat ion . fami l y ; // "Felinae "
sam [ " c l a s s i f i ca t i on " ] . fami l y ; // "Felina e "
sam . cl a s s i fi cat i on [ " famil y " ] ; // "Felina e "
sam [ " c l a s s i f i ca t i on " J [ " famil y " J ; // "Felinae "

(function).
6, , ( ,
). sam.
sam . speak = function ( ) { return "Meow ! " ; } ;

, .
sam . speak ( ) ; 1 1 Meow !

delete .
del e t e sam . cl a s s i fication; / / classifi ca tion
delete sam . spea k ; / / speak

- (),
" JavaScript ?"
; 9.

Number, String Boolean


, ,
(Numer, String Boolean ) . :

72 . , ,
(, Numer . INFINITY)
. .
const s = " he l lo " ;
s . t oUpperCase ( ) ; / / "HELLO"

, s - (
, ). , s -
. ? JavaScript
S t ring ( toUpperCase,
). JavaScript .
.
const s = " h e l l o " ;
s . rat ing 3; = / / . . . ?
s . rating; / / undefined

JavaScript , ,
s. S tring,
. ,
s . rat ing undefined.
JavaScript ( ),
.


(array) JavaScript - .
(
1), .
,
, 8.
JavaScript , ,
JavaScript -
, .
JavaScript .
;
.
;
.
. ,
- .
- ,
,
( , )
. ,

, .
JavaScript ,
, .
const al ( 1 , 2, 3, 4 ] ; / / ,
const 2 = ( 1 , ' two ' , 3 , null ) ; / / ,
const = [ / /
"What the hammer ? What the chain ? " ,
" In what furnace was thy brain? " ,
"What the anvi l ? What dread grasp" ,
" Dare i t s deadly terrors clasp ? " ,
);
const 4 = [ 1 1 ,
name : " Ruby" , hardne ss : 9 } ,
name : " Di amond " , hardnes s : 1 0 } ,
name : " Topa z " , hardne s s : 8 } ,
);
=
const 5 [ 1 1 ,
[1, 3, 5] '
[2, 4, 6] '
];

l e n gth,
.
const arr = [ '' , '' , ''J ;
arr . length; //


( ,
).
const arr [ '', '' , ' ' J ;

/ / :
arr ( 0 ) ; 11 ' '

/ / - arr . length - 1 :
arr [ arr . length 1) ; - // ' '

-
4

4 new, 9;
.

74 3. , ,
const arr = [1, 2, ' ' , 4, 5) ;
arr [ 2 ] = 3; 1 1 arr [1 , 2 , 3, 4 , 5 ]

8
.


, , ,
, ,
( ) .
con s t arr =
" One " ,
" Two " ,
" Three " ,
];
cons t = {
one : 1 ,
two : 2 ,
thre e : 3 ,
};

, Internet Explorer
( ,
JavaScript). ,
,
. , ,
; .
, . (
), .

JavaScript Object Notation (JSON) (


, JavaScript)
.

JavaScript Da te.
.
Java ( , JavaScript
Java); Date ,
.

75
, ,
new Date ( ) .
const now = new Date ( ) ;
now ; // : Thu Aug 20 2 0 1 5 1 8 : 31 : 2 6 G-0 700 (Pa c i fi c Dayligh t Time)

, ( 1 2:00 ).
const halloween = new Date ( 2 0 1 6 , 9 , 3 1 ) ; / / :
1 1
1 1 : 9=0ctober

, .
const halloweenPar t y = new Date ( 2 0 1 6 , 9, 3 1 , 1 9 , 0 ) ; 11 1 9 : 00 = 7 : 00

, .
halloweenPart y . getFullYear ( ) ; 11 201 6
halloweenParty . getMonth ( ) ; 11 9
halloweenPart y . getDate ( ) ; 11 31
hal loweenParty . getDay ( ) ; 11 1 ( ; O=Sun , l =Mon , . . . )
hal loweenParty . getHours ( ) ; 11 19
hal l oweenParty . getMinute s ( ) ; 11
halloweenPart y . getSeconds ( ) ; 11
hal l oweenPart y . getMi l l i seconds ( ) ; 11

1 5.

r
(regular expression regex, regexp)
JavaScript. ,
-
.
1 7. JavaScript
RegExp,
. ( ,
).
//
const ema i l = / \b [ a- z 0 - 9 . _- J + @ [ a- z_- ] + ( ? : \ . [ - z ] + ) +\/ ;

/ /
const phone = / ( : ? \ + l ) ? ( : ? \ ( \d { 3 } \ ) \ s ? l \d { 3 } [ \ s - ] ? ) \d { 3 } [ \ s - ] ? \d { 4 } / ;


S Set, ""
, WeakMap WeakSet. , ,

76 . , ,
,
. ,
. ,
, .
1 0.


- .
, ,
.
.


.
, ,
. JavaScript .
- Nwner5
const numStr = " 3 3 . 3 " ;
const num = Numer ( numSt r ) ; / / , * *
/ / Number

, NaN.
parseint
parseFloat. Nwner,
. parseint
(radix) . , 1 6,
.
, 10 (). parseint parseFloat
, ,
. .
const = parse int ( " 1 6 volt s " , 1 0 ) ; 1 1 " vol ts " ; 1 6
// 1 0
const parseint ( " " , 1 6 ) ; //
// ; 58-

const parseFloat ( " 1 5 . 5 kph " ) ; / / " kh " ;


// parseFloa t
/ / 1 0

5 new, 9;
.

77
valueOf ( ) , Date ,
1 1 970 (UTC).
const d = new Date ( ) ; / /
const ts = d . valueOf ( ) ; / / :
/ / 1 1 9 70 ()

1 ( )
(). (
5).
const true ;
const n = ? 1 : ;


JavaScript toString ( )
,

. .
, :

. - ,
toString ( ) - , .
const n = 33 . 5;
n; / / 33. 5 -
const s n . toString ( ) ;
s; / / "33 . 5 " -

Date toString ( ) ,
" [ obj ect Obj ect ] " .
,
, 9. toString ( )
, , .
const arr =[ 1 , true , " h e l lo " ] ;
arr . toString ( ) ; / / "1 , true , hello "

r
5 "" "" JavaScript,
,
. ,
"" ( ! )
.
, , ;
, .

78 . , ,
Boolean ( new)
.
const n = ; / / "false "
const ! !n; / / false
const 2 = Boolean ( n ) ; / / fal se


, , -
, .
,
.
JavaScript (, , ,
, ) .
JavaScript - .
- ;
.
(, ,
) .

, , ,
.
4

- .
, :

. ,
. , , : " "
" '; , , ,
.
- ,
.
,
, (++, Java, #),
,
. ,
, XIX .


- (flowchart),
.
(simulation) . ,

XIX (Crown and Anchor).
: , "';
"'; "'; "'; "" "':
- . 1
, .
,
. .

1 ,

, 1917 .
, ,
5 , , 15
5 , , 10
5 , , 5
5 , ,
3 , 2 , , 9
3 , 2 , , 5
1 3 ( !)

,
.
, -
XIX ,
. , ,
, , ,
.
.
, ,
. , "" ( ),
, -
.
: .
50 .
: , 1 00
( ).
, .
: ,
( ). , ,
, -,
. 4. 1 .
- " ':
. .
'
- ( )
. ,
. , " "
. ? ?
" ': " " " "
- ( -,
). ,
, .

82 4 .

. 4. 1 . - " "

,
: " 100 ?" - , .
?
- .
: funds = 50, bets = { } , hand = [].
: rand ( 1 , 6 ) (
, ).
("", "" ..): randFace ( ) (-
).
: bet s [ "heart " ] = 5, bets [ randFace ( ) ] 5.
: hand . push ( randFace ( ) ) .
: funds - tot alBet, funds + winnings.
: r o l l ++ ( , "
roll ").
- .
( funds > , funds < 1 0 0).
( totalBet 7; ,
, 5).
(funds > && funds < 1 0 0;
"", 5).
" " ,
JavaScript .

83
:
(truthy) (falsy). ""
(true) (false): JavaScript.
5, "" "':
, ,
, . 4.2.

whil

. 4.2. - " " ()

n while
, , ,
. - ,
; while. whi l e ,
(condition) . - - funds > 1 & & funds <
1 0 0 . , .
let funds = 50; / /

whi l e ( funds > 1 & & funds < 1 0 0 ) {


/ /

/ /

/ / J

84 4.
, ,
, 50 ,
, . ,
, (k statement).


( (compound
statement)) ,
. - ,
JavaScript .
, , .
/ /
console . log ( " statement l " J ;
console . log ( " statement 2 " ) ;
/ !

cons o l e . log ( " s tatement 3 " ) ;

consol e . log ; ,
.

. , whi l e ,
. ,
" ",
l e t funds = 50; / /

whil e ( funds > 1 & & funds < 1 0 0 ) {

funds funds + 2 ; / /
funds funds - 1 ; / /

whi l e : funds
. funds
100, .

, . , 1 00 ,
.
l e t funds = 5 0 ; 1 1

whi l e ( funds > 1 & & funds < 1 0 0 )


funds = funds + 2 ;

85

( 2):
JavaScript: , 1 0,
1 - 1 . ,
. , while
while ( funds > 1 & & funds < 1 0 0 )

funds = funds + 2 ;

!
, .
, , .
/ /
whi l e ( funds > 1 & & funds < 1 0 0 ) funds = funds + 2 ;

/ / ,
while ( funds > 1 & & funds < 1 0 0 ) { funds = funds + 2 ; }

, (
) (
). , ,
.
whi l e ( funds > 1 & & funds < 1 0 0 )
funds funds + 2 ;
funds = funds - 1 ;

, while (
), , JavaScript
.
whi l e ( funds > 1 && funds < 1 0 0 )
funds = funds + 2 ; / / whi l e

funds = funds - 1 ; / / whi l e

, ,
, , ,
, . ,
,

.

2 return ;
6.

86 4.

, :
i f .
//
if ( funds > 1 ) {
console . log ( " There ' s money left ! " ) ;
console . log ( " That means keep playing ! " ) ;
else
console . log ( " I ' m broke ! Time to qui t . " ) ;
//
i f ( funds > 1 )
console . log ( " There ' s money left ! playing ! " ) ;
else {
console . log ( " I ' m broke " 1 ) ;
console . log ( " Time to qui t . " )


.
( ),
; .
/ / (, ] ()
function rand (m, n ) {
re turn m + Math . floor ( ( n - m + l ) *Math . random ( ) ) ;

1 1 ,
/ /
funct i on randFace ( ) {
re turn [ " crown " , " anchor " , " heart " , " spade " , "club " , "diamond" ]
[ rand ( O , 5 ) ] ;

if".else
"
" -. ?
. (
). . ,
, 7 . , 7 ,
"".
( ). -
" " . 4.3.

87
bets = (crown: , anchor: , heart: ,
spade: , club: , diamond: 0)

bets('heart') = i;..
,;_____ _,
totalBet

. 4.3. " ": -

( totalBet === 7)
i f . . . e l se. , while
: ,
. - JavaScript.
const bets = { crown : , anchor : , heart : ,
spade : , club : , diamond : } ;
l e t totalBet = rand ( l , funds ) ;
i f ( totalBet === 7 ) {
totalBe t = funds ;
bet s . heart = totalBe t ;
else
/ /

funds = funds - totalBet;

, else if . . . e l se .

88 4.
n do . . . while
7 ,
. :
, ( )
( ).
- ,
, . 4.4.

do-while

bets[face]= remaining =

bets[face] + bet remaining - bet

. 4.4. " ": -

, while:
, . do while , ,
. . .

( while
, ). JavaScript.
let remaining = totalBe t ;
do {
let bet = rand ( l , remaining ) ;
let face = randFace ( ) ;
bet s [ face ] = bets [ face ] + bet ;
remaining = remaining - bet ;
whi l e ( remaining > 0 } ;

89
for
! .
for ( while do . . .

while), ,
( ),
(
- ). "-" ,
. 4.5.

hand = []
do-while

roll = O

roll++

hand.push(randFace())

. 4.5. " ": -

for : (roll = ), (roll < 3 )


(rol l ++ ). ,
while,
. JavaScript.
const hand = ( ] ;
for ( le t roll = ; roll < 3 ; roll + + ) {
hand . push ( randFace ( ) ) ;

,
2.

90 4 .
i (
"") for ,
, .
roll, ,
, , ,
, i !

if
! ;
, . hand
, for , .
i f ( e lse).
- . 4.6.

die++

do-while

winnings = funds =
winnings + bets(face) funds +winnings

. 4. 6. " ": -

if . else i f:
. .

, i f . else . . -

. .

91
let winnings ;
for ( let die=O ; die < hand . lengt h ; die++ ) {
let face = hand [die ] ;
i f ( bet s [ face] > 0 ) winnings winnings + bets [ face ] ;

funds = funds + winnings ;

, 3 for hand . length


( 3). -
. ,
... , ,
. ,
.
, :
.


- , ,
.
( )
console . log,
(
: ,
).
round ,
, .
// [ , ] ()
funct ion rand (m, n) {
return m + Math . floor ( ( n - m + l ) *Math . random ( ) ) ;

/ / ,
//
function randFace ( ) {
return [ " crown " , " anchor " , "heart " , " spade " , "club " , "diamond" ]
[ rand ( O , 5 ) ] ;

let funds 5 0 ; //
let round ;

whi le ( funds > 1 & & funds < 1 0 0 ) (


round++ ;
console . l og ( ' round $ ( round } : ' ) ;
console . l og ( ' \ t s tart ing funds : $ { funds } p ' ) ;

92 4.
/ /
let bets = { crown : , anchor : , heart : ,
spade : , club : , diamond : } ;
l e t totalBet = rand ( l , funds ) ;
i f ( totalBe t === 7 ) {
totalBet = funds ;
bets . heart = totalBe t ;
else {
/ /
let remaining = totalBe t ;
do {
let bet = rand ( l , remaining ) ;
l e t face = randFace ( ) ;
bets [ fa c e ] = bets [ face ] + bet ;
rema ining = remaining - bet ;
whi l e ( remaining > 0 )

funds = funds - totalBe t ;


console . log ( ' \ tbet s : ' +
Obj ect . keys (bets ) . map ( face => ' $ { face } : $ { bet s [ face ] } pence ' ) . j oin ( ' , ') +
' ( total : $ { tota1Be t } ) ' ) ;

/ /
const hand = [ ] ;
for ( let roll = ; roll < 3 ; rol l + + ) {
hand . push ( randFace ( ) ) ;

console . log ( ' \thand : $ { hand . j oin ( ' , ')}');

/ / r
let winnings = ;
for ( let die= O ; die < hand . lengt h ; die++) {
let face = hand [ die ] ;
i f ( b e t s [ face] > 0 ) winnings winnings + bets [ face ] ;

funds = funds + winning s ;


console . log ( ' \twinnings : $ { winnings } ' ) ;

console . log ( ' \ tending funs : $ { funds } ' ) ;

JavaScript
, ,
,
, .

JavaScript 93
-.
( , ),
.
,
: (conditional), (branching), (loop).
( i f i f . . . else,
, swi tch, ) :
, . (while,
do . . . while for) , .


, -
. " " .
break. .
continue. .
return. (
, ). (. 6.)
throw. (exception),
(
). (. 1 1 .)
;
,
.

if . . . else
i f . . . l s - ,
i f . . . e l se, e l s e
i f . . . else. ,
. ,
,
if . . . else.
i f ( new Date ( ) . getDay ( ) 3) 1 1 w Da te () . getDay ()
/ /
totalBet = 1 ; 1 1 , =
e l s e i f ( funds === 7 )
totalBet = funds ;
else {
console . log ( "ec ! " ) ;

94 4.
i f . . . e l s e ,
. ,
(
), :
. .
i f ( new Date ( } . ge t Day ( ) === 3 ) {
totalBet = 1 ;
else {
i f ( funds 7)
t otalBe t = funds ;
else {
console . log ( " ec ! " ) ;

, ,
.


(metasyntax) ,
.
- (Extended Backus-Naur Form - EBNF) -
.

JavaScript.
, , , JavaScript
Mozilla Developer Network (MDN). MDN - , ,
, , .
: ,
, , ( -
) " - ". ,
. , l 2
, - , ,
, .

, - "., ,
, .

,
.

JavaScript 95
while

whi l e ( )

, .

if . . . else

i f ( )
l
[else
2]

, l;
2 ( else).
do . . . while

do

whi l e ( ) ;

,
.

for

fr ( [ ] ; [ ] ; [ '._] )

.
, , _ ,
.

for
( 5),

. for .
for ( let t emp, i=O, j = l ; j < ; t emp = i , i = j , j = i + t emp )
console . log ( j ) ;

( temp, i j ) ,
.
for ,
.
for ( ; ; ) consol e . log ( " ! " ) ;

96 4.
for unde fined, , ,
.
for
, , .
.
let s = ' 3 ' ; / / ,
for ( ; s . length< l O ; s ' ' + s ) ; / / ;
11 ,
11 , for !

for ( le t = . 2 ; < . 0 ; += 0 . 2 ) //
console . log ( x ) ;

for ( ; ! playe r . isBroke ; ) 1 1


console . log ( "Bce ! " ) ;

, for whi le.


,
for ( [ ] ; [ ] ; [ _ ] )

[ ]
while ( [ ] )

[ _ ]

, for while,
, . for ,
, ,
. , let
for ( -
7); for whi l e,
for.

Onepaop switch
i f . . . e l se ,
switch
. - , "/
": swit ch ,
-

. swi t ch .
swith ( ) {
case l :

JavaScript 97
1 1 , l
[ brea k ; ]
case 2 :
1 1 , 2
[ brea k ; ]

case N:
1 1 , N
[ brea k ; ]
de faul t :
1 1 ,
1 1
[break ; ]

JavaScript , case
, break, return, cont inue,
t hrow switch ( ).
, : - swi t ch
, .
.
, swi tch :
, , ,
, , , .
swi t ch.
,
swi tch, .
switch ( totalBe t )
case 7 :
totalBet funds ;
bre a k ;
case 1 1 :
totalBet ;
bre a k ;
case 1 3 :
totalBet ;
bre a k ;
case 2 1 :
t ot a lBet 21;
bre a k ;

, 1 1 1 3 .
.
, , swi tch ,
break. .

98 4 .
switch ( totalBet )
case 7 :
totalBet funds ;
bre a k ;
case 1 1 :
case 1 3 :
totalBet ;
brea k ;
case 21 :
totalBet 21;
break ;

: , ,
1 1 1 3 . 1 3
, 1 1, ,
? .
switch ( totalBe t )
case 7 :
totalBet funds ;
brea k ;
case 1 3 :
funds = funds - 1 ; / / 1 !
case 1 1 :
totalBet = ;
brea k ;
case 21 :
totalBet 21;
bre a k ;

totalBet 1 3, ,
break , ( 1 1 ),
totalBet . JavaScript,
, , .
: ( ). ,
" break':
break, .
, , ,
, ,
, .
, default,
, . ( ),
defaul t .
switch ( t otalBe t )
case 7 :

JavaScript 99
totalBet funds ;
bre a k ;
case 1 3 :
funds = funds - 1 ; / / 1 !
case 1 1 :
totalBet = ;
bre a k ;
case 2 1 :
t o t a lBet 21;
bre a k ;
defau l t :
console . log ( " ec 1 " ) ;
b re a k ;

break , ,
break .
break:
break , ,
break, , ,
. -
switch (. 6), break
return ( ).
funct i on adj ustBe t ( t otalBet , funds ) {
swi t ch ( totalet ) {
cas e 7 :
return funds ;
cas e 1 3 :
return ;
default :
return totalBet ;

, JavaScript ,
break ( return) ,
swi tch .
swi tch ( totalBe t ) {
case 7 : totalBet = funds ; bre a k ;
case 1 1 : totalBet ; brea k ;
case 1 3 : totalBet ; bre a k ;
case 2 1 : t o ta lBet 2 1 ; brea k ;

,
1 1 1 3 : , -
.

1 00 4.
swi tch ,
. ,
, 9.

for . . . in
for . . . in .
.
for ( in )

.
const player = { name : ' Thoma s ' , ran k : ' Midshipman ' , age : 25 } ;
for ( let prop in player ) {
i f ( ! player . ha sOwnProperty ( prop ) ) cont inue ; / / .
console . log ( prop + ' : ' + player [prop ] ) ;

, ;
9. , player . hasOwnProperty ,
- , 9.
,
.

for . . . of
for . . . of ES6,
-

. .
for ( of )

for . . . of
( iterale) (. 9) .
.
const hand = [ randFace ( ) , randFace ( ) , randFace ( ) ] ;
for ( le t face o f hand)
console . log ( ' You rolled . . . $ { face } ! ' ) ;

for . . . of - , ,
.
, for.
const hand = [ randFace ( ) , randFace ( ) , randFace ( ) ] ;
for ( let i=O ; i<hand . length ; i + + )
console . log ( ' Roll $ { i+ l } : $ { hand [ i ] } ' ) ;

JavaScript 101

,
JavaScript, ,
.

continue


( , ), .
while ( funds > 1 & & funds < 1 0 0 ) {
l e t totalBet = rand ( l , funds ) ;
i f ( totalBet === 1 3 ) {
console . log ( " Heyaa ! . . . . " ) ;
else {
1 1 . . .

; whi l e
e lse , i f -

console . l og. continue,


.
while ( funds > 1 & & funds < 1 0 0 ) {
l e t totalBet = rand ( l , funds ) ;
i f ( totalet === 1 3 ) {
conso l e . log ( " Heyaa ! . . . . " ) ;
continue ;
}
1 1 . . .

, ,
1 , 20;
, .

break return

-, ,
,
.

1 02 4.
, ,
.
, .
let firstPrime = nul l ;
for ( le t n o f gArrayOfNumers )
i f ( isPrime ( n ) & & firstPrime nul l ) firstPrime = n ;

igArrayOfNwners
( ), .
? , ?
, !
. break, .
let firstPrime = nul l ;
for ( le t n of gArrayOfNumer s )
i f ( isPrime ( n ) ) {
firstPrime = n ;
bre a k ;

, b reak
return.




break.
, for
. , ,
break. ,
.
let i = ;
for ( ; i < gArrayOfNumers . lengt h ; i + + ) {
i f ( i sPrime ( i gArrayOfNumers [ i ] ) ) break ;

i f ( i === gArrayOfNumers . length ) con s o l e . log ( ' He ! ' ) ;


e l s e console . log ( ' epoe $ { i ) . ' ) ;



,
.

1 03
, ,
. ,
, . ,
, .
,
igArrayOfNumers. splice Array,
(. 8).
, .
for ( let i=O ; i<igArrayOfNners . length; i + + ) {
i f ( isPrime ( igArrayOfNumers [ i ] ) ) gArrayOfNners . splice ( i , 1 ) ;

, , ,
( ).
, .
for ( let i=igArrayOfNumer s . length - 1 ; i >= ; i - - ) {
i f ( isPrime ( i gArrayOfNumers [ i ] ) ) igArrayOfNumers . splice ( i , 1 ) ;

:
, ,
. , , i
;
( , ).


.
,
.
- - .
-,
. - , -
( )
(,
, ,
).

104 4 .
S

(expression) - ,
. - ( )
( ) :
, .
(.. ) ,
- -. ,
: " - ':
, , ;
, .
" , ';
: ,
- . , ,
,
.
: ,
.
,
, , ,
.. ( ), ,
, .
, ,
. ,
, .
: . , -
: , .
.
let ;
= 3 * 5;
- (statement) ;
. , ,
. :
. (expression), 3 * 5 , - ,
1 5 . - 1 5
. , - ,
, , .
? , ,
. ,
15, 15. -
, , , ,
. ( ) .
let , ;
= 3 * 5;
=

, , 1 5 .
, , .
JavaScript , ,
.
let , ;
= 3 * 5 ; / /
= 15; 1 1
15; 1 1 ;
1 1 1 5 , undefined
15; 11 ;
1 1 1 5 , -1 5 ,
1 1 - .
11
- " JavaScript ,
?" ,
= , undefined,
- ,
undefined, - 1 5 . , JavaScript
, (operator precedence),
.
, ,
-. ,
() ( ,
).
:
(.. ) .
, , .
,

1 06 5 .
: , , ,
, , - .

"" "" .
, (expression) - , ;
( operator) - , , .
- .
.
, .
( operand)
. , 1 + 2 -
1 2 , + - . -
, (argument).


JavaScript . 5. 1 .
5.1 .

+ ( 3 + 2 // 5
)
3 - 2 11 1
/ 3/2 11 1.5
* 3*2 11 6
% 3%2 11 1
- / / ; 5 ,
- 5
-

+ + / / ,

++ ++ / /

++ ++ / /

( . . )
-- / /

-- / /

( . . )

1 07
, JavaScript , ,
(, 3 / 2 ) ,
( 1 . 5).
(
""), JavaScript , ?
. ,
.
cons t 5;
const = 3 - -; 1 1 8

. .

.
const s = "5";
const = 3 + + s ; / / 8 ;
/ / : "35 "

1 1
cons t xl , 2 3 , 3 = - 1 . 5 , 4 = - 6 . 3 3 ;
const pl -x l * l ;
cons t 2 +2 * 2 ;
const 3 +3 * 3 ;
cons t 3 -4 * 4 ;

,
.
, "" ,
.
.
% , () ().
, 1 0 % 1 (3 10 1 ). ,
, ,
.
, JavaScript
. , 1 0 % 3 . 6 3 ( 3 . 6 10 ,
2.8).
( ++)
. (--)
. ,
: ,
" " (
). (prefix)

1 08 5 .
(postfix) .
, ;
, . ,
(:
,
).
=
let 2;
const rl ++ + ++ ;
const r2 ++ + ++ ;
con s t r ++ + ++ ;
const r4 ++ + ++;
=
let 10;
const rS - - + - - ;
const r - - + - - ;
const r7 - - + - - ;
const r8 - - + - - ;

JavaScript ,
rl - r8, .
,

, .
=
let 2;
const r l ++ + ++ ;
=

11 ( (++) + (++) )
11 ( 2 + (++) ) ;
11 3
11 2 + 3 ) 4
11 5 5 ; 4
const r2 = ++ + ++;
// ( (++) + (++) )
11 ( 5 + (++) ) ;
11 5
11 ( 5 + 6 ) 6
11 11 1 1 ; 6
const r = ++ + ++;
11 ( (++) + (++) )
11 ( + (++) ) ;
11 7
11 6 + 8 8
11 14 1 4 ; 8
11
// . . .

1 09

, ,
, , -
JavaScript.
, ,
JavaScript .
, ,
.
, - (
, ).
8 + 2 + 3 (4 2 - 1)

- 25, . ,
, ,
.
, (
), JavaScript .
, JavaScript
, ,
"PEMDAS" "Please Excuse Dear Aunt Sally" (,
).
JavaScript ,
: . -
, , :
,
, .
JavaScript 56 , 19
(precedence level).
.
( ),
, ,
.
.
,
. , ( 14)
, ( -
3) . ,
.

1 10 5 .
let = 3 , ;
+= = 6 * 5 / 2 ;
11
11 :
11
11 ( - 1 4 , ) :
11 += ( 6*5) /2
11 += = (30/2)
11 += = 1 5
11 ( - 3 , ) :
11 += ( = 15)
11 += 1 5 ( 1 5 )
11 18 ( 1 8)

,
.


, ,
. : ,
( ) . (
: - " ';
.)
(strict
equality) (abstract equality).
, .
,
( ).
, ,
. ,
, === -
( ! == ). ,
.
,
( )
.
. . , ,
33 " 3 3 " , , ,
, (
). , ,
,
. ;

111
, , .
-
==, - !
=.


, favaScript: The Good Parts (
O'Reilly).


nul l, unde fined,
. , ,
, ,
.
. ,
, ,
.
, ,
;
.
,
,
,
. -
,
.


. : ,
, , , .
const n = 5 ;
const s = " 5 " ;
- --
n s; 1 1 fa lse - -
n ! == s ; 1 1 true
--- -
n Numer ( s ) ; 1 1 true - "5 " 5
n ! == Numer ( s ) ; 1 1 fa lse
--
n s; 1 1 true;
n != s; 1 1 fa lse;
const = name : " an obj ec t " } ;
cons t name : " an obj ec t " } ;
---
; 1 1 fa lse - -
! == ; 1 1 true
--
; 1 1 fa lse;
! = ; 1 1 true;

1 12 5 .

, ( 11 11
"11) ( 1). - (<),
(<=), (>) (>=).
3 > 5; 1 1 fa lse
3 >= 5 ; 1 1 fa lse
3 < 5; 1 1 true
3 <= 5 ; 1 1 true
5 > 5; 1 1 fa lse
5 >= 5 ; 1 1 true
5 < 5; 1 1 fa lse
5 <= 5 ; 1 1 true



.
, ,
NaN , (.. NaN === NaN, NaN == NaN
false). , NaN,
isNaN: isNaN ( ) t rue, NaN, false
-

.
, JavaScript - ,
( ),
.
( Nurner . MIN SAFE INTEGER Numb e r . _ SAFE
_ _ _

INTEGER ),
.
, , " "
. " "? .
JavaScript , Nurne r . EPSILON.
(2 . 2 2-1 6), ,
, . .
let n = ;
while ( t rue) {
n += 0 . 1 ;
i f ( n === 0 . 3 ) bre a k ;

console . log ( ' Stopped at $ { n } ' ) ;

, :
. 3,

1 13
. , . 1 - ,
,
.
n . 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 , fals e
.
, Numbe r . E P S I LON
, " "
.
let n = ;
while ( t rue )
n += 0 . 1 ;
i f ( Math . ab s ( n - 0 . 3 ) < Numer . E P S I LON ) bre a k ;

conso le . log ( ' Stopped a t $ { n ) ' ) ;

, ( . 3)
(n) ( Math . abs,
1 6), .
, n . 3.
,
, ,
.


JavaScript + ,
( ; ,
+ , Perl ).
, , JavaScript
. ,
. JavaScript ,
, .
, .
.
3 + 5 + 11 8 11 / / - " 8 8 11
"" + 5 + 8 11 - "358 "

JavaScript ( 3 + 5 ) ,
( 8 + " 8 " ) . ( " 3 " + 5 )
, ( " 3 5 " + 8 ) - .

114 5 .
r
, ,
, ,
( ,
),
, : .
( )

. JavaScript , , ,
, ,
. , JavaScript
- : ,
, .
,
JavaScript.


"" ""; ,
, : - ,
- . JavaScript ,
, .
JavaScript ( false).
undef ined
nul l
false

NaN
' ' ( )

- ( t rue ) .
, , , .
( , valueOf ( ) false).
( ).
, (, " ").
" false".
, " fa l s e " ()
( t rue ) , .
, - t rue. , arr
false, , arr . l ength ( , ,
, false ) .

AN D, OR NOT
JavaScript : AND ( & &), OR ( 1 1 ) NOT ( ! ) .
, , AND ( ) -
, OR () - NOT () - .
, ,
,
,
(. . 5.2-5.4).
n 5.2. n n AND (&&)
&&
false false false
false t rue false
t rue false false
t rue t rue true
n 5.3. n OR ( 1 1 )
x 11 v
false false false
false t rue true
t rue false t rue
t rue t rue t rue
5.4. n NOT ( ! )
!
false t rue
t rue false

, AND
t rue, - t rue; OR
false, - false. NOT ,
.
OR OR ("inclsive OR''), ,
t rue, - t rue. OR ("exclusive
OR") XOR, false, - t rue. JavaScript
XOR, XOR, .

116 5 .
OR (XOR)
, ,
( 1 1 ) & & ! == .


AND (. . 5.2),
, : - ,
. , 1 1 - ,
. JavaScript
(short-circuit evaluation).
? ,
(side effect),
. " "
- , :
, .
,
, .
, .
const skipit t rue ;
let = ;
const result s kipit 1 1 + + ;

,
result. t rue,
( s kipit ) - t rue. , , , -
, .
skipit false,
: - .
.
const do i t = fals e ;
let = ;
const result = do i t & & ++ ;

JavaScript ,
, AND false. , resul t
fal s e, . , doit t rue?
JavaScript ; ,
resul t . ? resul t ,
false? .

AND, OR NOT 117


r n r
,
.
, . 5.5 5.6.
5.5.
AND ( & & }
&&
()
()
()
()

5.6.
OR ( 1 1 }
x 11 v
()
()
()
()

, ,
AND OR.

. .
const options = supp l iedOptions 1 1 { name : " De faul t "

, ( )
. , s uppl i edOp t i on s , o p t i o n s
-

s upp l i edOpt i o n s . ,
suppliedOpt ions nul l unde fined, opt ions
.
NOT ,
, ( ! )
. , false,
-true.


- (ternary)
JavaScript: (

118 S .
). - , i f . . . else.
.
const doi t = fal s e ;
const result = do l t ? " ! " : " ! " ;

( ,
doit) , (
-

), , (
).
i f . . else, ,
.

, :
(, result ).

'1 "
"" :
. ,
, ,
, .
.
let = , = 1 0 , z ;
z = ( + + , ++ ) ;

, ,
z 1 ( ++). ,

,
. z (
+ + ), .
for (. 4)
(. 6).


, ( ) ,
( ) . ,
- " " ,
.

1 19
, 1,
, , , ,
(
, ).
32-
, .
JavaScript - , JavaScript 32-
, ,
, .
, ,
(, , , XOR), .
. 5.7 , ,

.
5 .7.

& AND l & l 1 1 :

OR 1 0 l 1 1 : 1 1 0

XOR 0 1 0 l 1 1 : 01 1 0
NOT - 1 0 1 1 : 0 1 0 1
<< 1 0 1 1 1 : 1 00
1 0 2 1 1 : l
>> (. )
>>> - (. )

, ,
.
.
1 , , , -

. , , -22.
, 22,
( .. ),
, .
let n = 22 / / 32- :
11 000000000000000000000000000 1 0 1 1 0
n >> 1 // 000000000000000000000000000 0 1 0 1 1
n >>> 1 // 00000000000000000000000000001 0 1 1
n = -n / / : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 01 001

1 , ,

, . -
. .

1 20 5 .
n++ 11 . : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 01 01 0
n >> 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 01 01
n >>> 1 11 01 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 01 01


, ,
( "
").
- "" (
).
, , Unix:
(read), (write) (execute).
, .
, .
const FLAG READ 1 / / ObOOl
const FLAG WRITE 2 / / 01 0
const FLAG EXECUTE 4 / /

,
, .
let = FLAG_READ 1 FLAG WRITE ; 1 1 ObO l l
let hasWrite = & FLAG_WRITE ; 1 1 01 0 -
let hasExecute = & FLAG EXECUTE ; 1 1 -
FLAG_WRITE ; 1 1 ObOOl -- wri t e
1 1 ( )
FLAG WRITE ; 1 1 ObOl l wri te
--

1 1 ( )

11
11 :
const hasRead.AndExecute = & ( FLAG_READ 1 FLAG_EXECUTE ) ;

, hasReadAndExecute
; AND , OR,
OR AND.

typeof
typeof , .
,
JavaScript (undefined, nul l, , , , ),
.
t yp e o f ,
: t ypeof nul l " ob j ect " . , null - (

121
). ,
,
.
.
typeof ,
, , .
( ), typeof
[ ] 11 obj ect 11
typeof . 5.8.
5.8. typeof

Typeof undef ined 11 undef ined 11
Typeof null 11 obj ect 11 ,
Typeof {} 11 obj ect 11
Typeof t rue 11 boolean 11
Typeof 1 11 nurner 11
Typeof 11 11 11 string 11
Typeof Sym ol ( ) 11 sym ol 11 S
Typeof funct ion ( ) {} " funct ion 11

typeof - , .
, ,
typeof typeof ( ) . -
- .

void
void : ,
undefined. ? , .
, undefined,
.
, , ,
URL HTML <>,
.
< href= " j ava script : void " > ! </>

, .


: . ,
( [- (lvalue)),

1 22 5 .
, . , ,
(
, ).
,
, , ( -
).
.
let v , v O ;
v = v O = 9 . 8 ; / / ; vO
11 9 . 8 , v 9 . 8

const nums = [ 3 , 5 , 1 5 , 7 , 5 ] ;
let n , i=O;
1 1 whi l e ;
1 1 n ums [ i ] ,
1 1 :
whi l e ( (n = nums [ i ] ) < 1 0 , i++ < nums . lengt h )
console . log ( ' co 1 0 : $ { n } . ) ;
'

console . log ( ' Haeo 1 0 : $ { n } . ' ) ;


console . log ( ' $ { nums . lengt h } . ' ) ;

,
,
.
,
, .
,
. . 5.9.
5.9.

+= = +
-
=
*= = *
/= = /
%= = %
<<= = <<
>> = = >>
>>>= = >>>
&= = &
1= = 1
"= =

1 23

S ( destructuring
assignment), ""
. .
11
const obj = { : 2 , : 3 , d : 4 } ;

/ /
const { , , } = obj ;
; 1 1 undefined: obj " "
; // 2
; 11 3
d; / / Wi : d
" "


(
).
, undefined. ,
d, .

.
, ;
JavaScript .
const obj = { : 2, : 3, d: 4 } ;
let , , ;

/ / :
{ , , } = obj ;

1 1 :
( { , , } = obj ) ;


.
11
const arr = [ 1 , 2 , 3 ] ;

/ /
let [ , ] = a r r ;
; 11 1
; 11 2
z; 11 : z Wia

, -
; , , .

1 24 5 .
(spread operator) ( . . . ),
6.
= [ 1 , 2, 3, 4, 5 ] ;
const arr
let [ , , . . . rest ] arr;
; // 1
; // 2
res t ; / / [3, 4 , 5 1

,
rest ( rest;
-

).
( ).
=
let 5, =10;
=
[ , ] [, ] ;
; 11 10
; 11 5

,
( 9).


, . ,
,
. 6.


, .
(,
), 6, 8 9.
. 5 . 1 0.
5.1 .

3
[] 3
in 9
new 9
instanceof 9
8
delete 3

1 25

(template string), 3,
.
3 .

, ? .
const roomTempC 21 . 5 ;
=

let currentTempC 19 .5;


=

cons t message = ' ' +


' $ { currentTempC-roomTempC } \u 0 0bOC . ' ;
const fahrenhei t =
' $ { currentTempC * 9 / 5 + 3 2 } \ u O O b O F ' ;

, .
, -
.


4 .
, , (
),
.

if .
else
, i f . else (
. .

,
), .
. ,
i f ( is Prime ( n ) ) {
label ' prime ' ;
else {
label ' non-prime ' ;

.
label = i s Prime ( n ) ? ' prime ' ' non-prime ' ;

1 26 5 .
if

, i f . e l se
. .

, i f
.
, if . . . e lse,
, . ,
i f ( ! opt ions ) opt ions = {};


opt ions = opt ions 1 1 {};


JavaScript, ,
,
. ,
, , , . ,
, ,
( ,
).
, ,
, , ,
.
6

(function) - ,
; , . -
JavaScript.
.
(body) -
.
function sayHello ( ) {
/ / ; . . .

console . log ( "Hello world ! " ) ;


console . log ( " ! Hola mundo ! " ) ;
console . log ( "Hallo wereld ! " ) ;
console . log ( "pe ! " ) ;

/ / . . .

s ayHel lo.
: ,
"He l l o world ! " .
( )
, :
sayHello ( ) ; / / "Hell o, Worl d ! "

(call), (t) (r) ,


, .
,
.

- , ,
. ? (return value).
return
, .
: .
funct i on getGree ting ( ) {
r e turn " He l l o world l " ;

, , .
getGre e t ing ( ) ; / / "He l l o , Worl d ! "

return undefined.
;
getGreetings, , "Hello, World"
.


JavaScript
. ( calling)
(referencing) .
, JavaScript , :
.
, , .
JavaScript.
getGreeting ( ) ; 1 1 "He l l o , Worl d ! "
getGreeting; / / getGree ting ()

, (
), . ,
, .
const f = getGreeting;
f() ; 1 1 "He l l o , World ! "

.
const = {};
o . f = getGreet i n g ;
. f ( ) ; / / "Hello, Wor ld ! "

1 30 .
const arr = [ 1 , 2 , 3 ] ;
arr [ l ] = getGreeting; // arr [ 1 , fun c t i on getGreeting () , 2 ]
arr [ l ] ( ) ; / / "He l l o , World! "

: JavaScript
.r , ,
. arr [ 1 ] ,
. , ,
JavaScript , - .

,
, . , " whoop s " ( )
TypeErro r : "whoops " i s not
funct ion.


, .

- (argument) (
(parameter)). , ,
. ,
.
funct ion avg ( a , ) {
r e t urn ( + ) / 2 ;

(formal
-

argument).
(actual argument).
avg ( 5 , 1 0 ) ; 11 7 . 5

5 1
( ,
).
,
, ,
. .
const = 5, = 1 0 ;
avg ( , ) ;

,
avg, .

1 31
, , ,
. .
funct ion f ( ) {
sl . lg ( ' f : =$ { } ' ) ;
= 5;
console . log ( ' Byp f : =$ { } ( ) ' ) ;

let = ;
console . log ( ' epe f : = $ { } ' ) ;
f () ;
console . log ( ' oce f : = $ { } ' ) ;

,
f : =
f : =
f : x=S ( )
f : =

,
; , ,
.
, ,
.
(object type) , ,
.
funct io f ( ) {
o . me s sage = ' f ( : 1 $ { 0 . me ssage } ' ) ' ;

let = {
mes s age : " "
};
console . log ( ' epe f : o . me s s age=" $ { o . me ssage } " ' ) ;
f () ;
console . log ( ' oce f : o . me s sage= " $ { o . me s s a ge } " ' ) ;

.
f : . m s s g = " "
f : . m s sg = " f ( :
' ' ) "

, f ,
.
.
( ,
). , , .

1 32 6 .
: ,
.
.
function f ( o )
o . me s sage = " f " ;
=
mes sage : " ! "
};
cons o l e . log ( ' Byp f : o . me s s age=" $ { o . me s sage } " ( ) ' ) ;
}
let = {
me s sage : ' '
};
console . log ( ' epe f : o . me s sage=" $ { o . me s s a ge } " ' ) ;
f () ;
console . log ( ' oce f : o . me s s age= " $ { o . me ssage } " ' ) ;

,
f : . m s sg=" "
f : o . me s sage = " Ho ! " ( )
f : o . me s sage=" f "

, (
) - . f
, f,
, ,
.

JavaScript (value type),


,
.
(reference type),
(..
).

?
(signature) .
, f ( ) ( ) f ( ) (
), f ( , ) (
). JavaScript ,
f, ,
( ).

1 33
,
. ,
undefined.
function f ( ) {
return ' f : =$ { } ' ;

f ( ) ; / / " f: x=undefined"

, ,
, .


(. 5),
(destructured argument) .
, !
.
function getSentence ( { sub j e c t , verb, obj ect } )
return ' $ { subj ect } $ { verb } $ { ob j e ct } ' ;

const = {
sub j ect : " I " ,
verb : " love " ,
obj ect : " JavaScript " ,
};

getSent ence ( o ) ; 1 1 "I love JavaScript "

,
, ,
, unde fined.
.
function getSentence ( [ subj ect , verb , obj ect ] ) {
return ' $ { subj ect } $ { verb } $ { ob j e ct } ' ;

const arr = [ " I " , " love " , " JavaScript " ] ;
getSentence ( arr) ; / / "I love JavaScript "

( . . . )
.
function addPrefix (prefix, . . . word s )
1 1 !

1 34 6.
const prefixedWords = [ ] ;
for ( le t i=O ; i<words . length; i + + ) (
prefixedWords [ i ] = prefix + words [ i ] ;

return prefixedWords ;

addPre fix ( " con" , "vers e " , " vex" ) ; // [ "converse " , "convex "]

:
, .
, JavaScript ,
, .

ESS
a rguments,
.
, " " ,
.
S

a rguments ( ).


S
(default value) . , ,
undefined.
, .
function f ( , = " defaul t " , = 3 ) {
re turn ' $ { ) - $ { } - $ { } ' ;

f (S, 6, 7 ) ; 11 "5 - - 7"


f (S , 6) ; 11 "5 - - 3"
f (5) ; 11 "5 - defa u l t - 3 "
f() ; 11 "undefined - defa ul t - 3 "


,
(method), (
). 3,

1 35
.
.
const =
name : ' Wallace ' , / /
bark : function ( ) { return ' Woof ! ' ; } , / / ()

S .
.
const = {
name : ' Wallace ' , / /
bark ( ) { return ' Woof ! ' ; } , / / ()

thi s

t h i s . -
, 9.
JavaScript, , .
this ,
. this
, .
const = {
name : ' Wallace ' ,
speak ( ) { return ' $ { this . name } ! ' ; } ,

. speak ( ) , this .
. speak ( ) ; / / " Wa l l a ce ! "

, this , ,
. , this , speak -
, , ( . speak).

, , .
const spe a k o . speak ;
=

speak === o . spe a k ; / / true;


speak ( ) ; / / " ! "

JavaScript ,
; , this
undefined.

1 36 6.
,
this ( speak ),
.
, , ,
.
, .
, Code formatting ( )
MDN.

(method) -
,
,
(, . speak ( ) ).
thi s ,
, .
this ,
.
, .
const = {
name : ' Ju l i e ' ,
greetBackwards : funct ion ( ) {
funct ion getReverseName ( )
l e t nameBackwards = ' ' ;
for ( le t i=thi s . name . length- 1 ; i >= O ; i - - ) {
nameBackwards += thi s . name ( i ] ;

return nameBackwards ;

return ' $ { getReverseName ( ) } si eman ym , ol l eH ' ;


},
};
o . greetBa ckwards ( ) ;

, getReverseName,
. , getReve rs eName ,
: . greetBackwards ( ) JavaScript this,
. getReverseName
greetBackwards, this - r1
,
thi s .

1 unde f ined, ,
. ,
.

this 1 37
const = {
name : ' Ju l i e ' ,
greetBackwards : funct ion ( ) {
const s e l f = thi s ;
funct ion getReverseName ( )
l e t nameBackwards = ' ' ;
for ( le t i=se l f . name . length- 1 ; i>= O ; i - - ) {
nameBackwards += sel f . name [ i ] ;

return nameBackwards ;

return ' $ { getRever s eName ( ) } s i eman ym , olleH ' ;


},
};
o . greetBackwards ( ) ;

,
this s e l f, that. ,
,
.


(function
declaration), (.. ,
), ( ).
JavaScript (anonymous function),
.
" ,
? ?"
(function expression). ,
- , , ,
- , JavaScript.
- , (, )
. - (
) 2
,
, .
,
( ).

2 (Immediately Invoked Function Expression -


IIFE), 7.

1 38 6 .
const f = function ( )
11 . . .
};

, :
f, .
, , f ( ) .
, (
) .
:
.
.
,
. . . ,
( ) ? .
const g = function f ( ) {
11 . . .

, g ,
( ) g; f
.
? ,
( (recursion)).
const g = funct ion f ( stop) {
i f ( stop) console . log ( ' f ' ) ;
f ( true ) ;
};
g ( fa l se ) ;

f, ,
g. ,
,
.

, JavaScript (
- )? r - :
, , , .
,
. ,
, , , , ,
-
, .

1 39

S
(arrow notation). (
, ),
funct ion,
, .
.
function.
, .
- ,
return.

.
, ,
function.
.
const f 1 function ( ) { r eturn "hello ! " ; }
1 1
const f l ( ) => "hello ! " ;

cons t f2 funct ion ( name ) { r eturn ' He l l o , $ { name } ! ' ; }


1 1
const f2 name => ' He l l o , $ { name } ! ' ;

cons t f function ( , ) { return + ; }


1 1
const f ( , ) => + ;

; ,
, .
,
8.

: this , ,
. greetBackwards .
this .
const = {
name : ' Ju l i e ' ,
greetBackwards : funct ion ( ) {
const getRever seName = ( ) =>
l e t nameBackwards = ' ' ,.

1 40 6.
for ( let i=this . name . length - 1 ; i>= O ; i - - ) {
nameBackwards += this . name [ i ] ;

return nameBackwards ;
};
return ' $ { getReverseName ( ) } s i eman ym , ol l eH ' ;
},
};
o . greetBackwards ( ) ;


: (. 9)
arguments (
).

call, apply ind


, this
( - ). JavaScript
, this, ,
. call,
. this.
const bruce { name : " Bruce" } ;
=

const madel ine = { name : "Made l in e " } ;

1 1 ,
1 1 ' this ' !
funct ion greet ( ) {
return ' ! $ { th i s . name } ! ' ;

greet ( ) ; / / " ! ! " - ' this '


greet . ca l l ( bruce ) ; // " !
Bruce ! " - ' this ' 'bruce '
greet . call (made l ine ) ; / / " ! Madeline ! " - ' this '
/ / 'made l in e '

, c a l l ,
, , thi s.
c a l l , this,
-

.
function update ( birthYear, occupat ion )
t hi s . birthYear b irthYe a r ;
=

t hi s . occupat ion occupat i o n ;


=

call, apply ind 1 41


update . ca l l ( bruce, 1 9 4 9 , ' s inger ' ) ;
/ / bruce { : "Bruce " , irthYea r : 1 94 9 ,
// occupa t io : "siger " }
update . ca l l (made l i n e , 1 9 4 2 , ' actress ' ) ;
/ / adelie { : "Madeli e " , irth Year : 1 942,
// occupa t io : "actress " }

apply call, ,
. call ,
, . apply .
update . app l y ( bruce , ( 1 9 5 5 , " actor" ] ) ;
/ / bruce { : "Bruce " , irthYea r : 1 955,
// tio : "a ctor" J
update . appl y ( made l ine , ( 1 9 1 8 , "writer " ] ) ;
/ / adelie { : "Ma deli e " , irth Year : 1 9 1 8 ,
11 occupa tio : "wri ter " }

apply ,
. -
. th . rnin th .
,
, . apply,
.
const arr = ( 2 , 3 , - 5 , 1 5 , 7 ] ;
Math . mi n . appl y ( nul l , arr ) ; 11 -5
Math . max . appl y ( nul l , arr ) ; 11 1 5

, this nul l.
, Math . rnin Math . rnax
this ; ,
this.
( . . . ) S ,
apply. update, this
, call, Math .
rnin Math . rnax, ,
, .
const newBruce = [ 1 9 4 0 , "mart i a l artist " ] ;
update . c a l l ( bruce, . . . newBruc e ) ; / / apply (bruce, ewBruce)
Math . min ( . . . arr ) ; // -5
Math . max ( . . . arr ) ; // 1 5

, ind,
thi s . i nd
t h i s . , upda te

1 42 6 .
, this
bruce, , ( call, app ly
bind). bind .
const updateBruce = update . bind ( bruce ) ;

updateBruce ( l 9 0 4 , " actor " ) ;


11 bruce ( : "Bruce " , birthYear : 1 90 4 , occupa tio : "a ctor" }
updateBruce . ca l l (madeline, 1 2 7 4 , " king" ) ;
1 1 bruce ( : "Bruce " , irthYear : 1 2 7 4 , occupa tio : "king" } ;
11 adeline wro !

, bind ,
, :
, call, app l y
bind ( ). , ,
, call apply
, this. , ind
, , .
ind ,
, .
, update,
bruce 1 9 4 9, ,
.
const updateBruce l 9 4 9 = update . bind ( bruc e , 1 9 4 9 ) ;
updateBruce l 9 4 9 ( " s inger, songwriter " ) ;
1 1 bruce ( : "Bruce " , irth Year : 1 94 9 ,
11 occupa t ion : "singer, songwriter" }


- JavaScript. ,
:
. -
, . ,
.
7

(scope) , ,
.
: , .
.
function f () {
return + 3 ;

f (5) ; 11 8
; 1 1 Referen ceError :

, (
+ 3 ), . ,
, - f.
, - ,
, ,
( , ,
). ,
, .
,
, . , ,
let cons t (var -
, ).


(declaration) (definition). ,
, ,
. , ,
. JavaScript
,
(
undefined).

, ,
. , , ,
, ,
.
? , ,
? ,
(scope) (existence) .
( (visiility)) ,

( (execution context)).
, , , ,
(.. ) .
, , .
, JavaScript
:
(garbage collection).
JavaScript
.


, (lexical
structure). ,
. .
funct ion fl ( ) {
console . log ( ' one ' ) ;

funct ion f2 ( ) {
console . log ( ' two ' ) ;

f2 ( ) ;
f1 ( ) ;
f2 ( ) ;

- ,
. ,
f2, - fl ( ,
f2) - f2.

1 46 7.
JavaScript , ,
, ,
. ,
: ,
.
,
,
( ). .
const 3;
=

function f ( ) {
console . log ( x ) ; / /
console . log ( y ) ; / / -

const 3;
f() ;

f ,
- . f.
f , .
-

: f ,
, L.
JavaScript (global scope),
(k scope) (function scope).


, .
, ,
(global scope). JavaScript
(, )
. , , ,
.
, ,
, , , .
,
" ".
?
, . ,
. ,
.
: .

1 47
: ",
!"
, .
, , ,
... !
: , ,
, , ,
. :
.
, , .
, .
let n ame = " I rena " ; / /
let age = 2 5 ; / /

funct ion greet ( )


console . log ( ' He l l o , $ ( name } ! ' ) ;

funct ion getBirthYear ( )


return new Date ( ) . ge t Ful lYear ( ) - age ;

,
( ), . (
) name ( ).
"name " " age" ( )
. greet
getBi rthYear , , ,
, name age .
.
let user = (
name " I rena " ,
=

a ge = 2 5 ,
};

funct i on greet ( ) (
console . log ( ' He l l o , $ ( user . name } ! ' ) ;

funct ion getBirthYea r ( )


return new Date ( ) . getFullYear ( ) - user . age ;


( name age,
user), 10 ... 1 00?

148 7.
: greet getB i r thYear
user, - .
,
.
function greet ( us e r )
console . log ( ' Hello, $ { user . name } ! ' ) ;

funct ion getBirthYear ( u s e r ) {


return new Date ( ) . getFul lYea r ( ) - user . age ;

,
( -
, ).
, ,
.
( ) ,
( , ).
.


l e t const
(lock scope). 5 , - ,
. ,
, .
console . log ( ' epe ' ) ;
{
console . log ( ' yp ' ) ;
const = 3 ;
console . log ( x ) : / /

console . log ( ' a ; =$ { } ' ) ; // ReferenceError :

(standalone k):
, i f for, ,
. ,
.
4 ,
; -
( ), .
,
.

1 49


.
, .

1 1 1
const = ' u ' ;
conso l e . log ( ) ; / / " "

console . lo g ( typeof ) ; 1 1 "undefined";


{
1 1 2
con s t = 3 ;
console . log ( x ) ; 1 1 ,,3,,

console . lo g ( typeof ) ; / / "undefined " ;

, , ,
. ,
.

//
let = ' u ' ;
console . log ( x ) ; 1 1 " "
{
1 1
let = 3 ;
console . log ( x ) ; / / "3 "

console . log ( ) ; / / " "

console . log ( typeof ) ; 1 1 "undefined";

(variale masking).
(
), ( ), ,
.
, ,
,
;
( ).
, , ,
.

1 50 7.
.

1 1
l e t = { color : "u" } ;
let ; 1 1
let z = 3 ;
{
1 1
let = 5 ; 1 1
console . log ( x ) ; 1 1 5
console . log ( y . color ) ; 1 1 " u " ; ,
1 1 (
1 1 ) ,
1 1
y . color = " red" ;
console . log ( z ) ; 1 1 3; z

console . log ( x . color ) ; 11 "red" ;


11
console . log ( y . color ) ; 11 "red";
11
console . log ( z ) ; 1 1 3

(shadowing)
( ..
).
, -
, .
, .


: , .
, ,
:
( ) .

,

,
,
. , , ,

, 1 51
- , , ,
, .
""
,
( ),
, .
JavaScript, ,
, . ,
, , ,
.

, .
(closure) (
, ).
.
l e t globa l Fun c ; / /

let lockVar = ' ' ; 1 1


global Func = funct ion ( )
console . log ( l ockVar ) ;

globalFunc ( ) ; / / " "

glob a l Func :
( , )
. , globalFunc,
.
: global Func
ockVar, 1
.
.
JavaScript , (
),
.
,
;
,
. .
let f; / /

let = { not e : ' ' } ;

1 52 7.
f fuct i o ( )
retur ;

l e t oRef = f ( ) ;
oRe f . o t e = " ! " ;

.
, ,
. .



6 .

(Immediately Invoked Function Expression - IIFE). IIFE ,
. ,
, , . IIFE
.
( fuct io ( ) {
/ / IIFE
} ) () ;

, ,
. IIFE ,
, , ,
.
cost message = ( func t i o n ( )
con s t secret = " ! " ;
return ' $ { s e cret . lengt h } . ' ;
}) ();
consol e . l og ( me s s age ) ;

secret IIFE,
. IIFE , ,
, . ,
.
const f = ( function ( )
let count = ;
return function ( )
return ' $ { ++count } ( ) . ' ;

1 53
}) () ;
f ( ) ; / / " () . "
f ( ) ; / / " 2 ( ) . "
11" .

count IIFE,
: f ,
.
S
IIFE, ,
.



S let
var (function scope) (
, var ,
).
let,
.
var, ".
. , ,
, , ,
undefined. ,
, , unde fined, - .
l e t var l ;
let var2 unde f ined;
varl ; / / undefined
var 2 ; / / undefined
undefinedVar ; / / Referen ceError : undefin edVar

let ,
.
; / / Referen ceError :
l e t = 3 ; / / -

, var, ,
, .
; / / undefined
var = 3 ;
; // 3

1 54 7 .
? ,
. ,
var, (hoisting). JavaScript
( )
, var. ,
, . , JavaScript
.
var ; / / ( )
; / / undefined
= 3;
; 11 3
,
JavaScript .
/ / / / JavaScript
var ;
var ;
i f ( x ! == 3 ) { i f ( x ! == 3 ) {
console . log ( y ) ; console . log ( y ) ;
var = 5 ; = 5;
i f ( y === 5 ) { if (y === 5)
var = 3 ; = 3;

console . log ( y ) ; console . log ( ) ;

i f ( === 3 ) { i f ( === 3 ) {
console . lo g ( y ) ; console . lo g ( y) ;

, JavaScript.
, .
. ,
.
, var, -
JavaScript .
/ / / / JavaScript
var ;
var = 3 ; = 3;
i f ( === 3 ) i f ( === 3 ) {
var = 2 ; = 2;
console . log ( x ) ; console . log ( x ) ;

conso l e . log ( x ) ; console . log ( x ) ;

, (
) var

155
. ,
let.
, var.
, .
( )
,
, i f,
.
" var
?': ,
let. , var
, ,
. S
"" var,
; let.
var,
let .
, var let,
JavaScript ( ) ,
let var ( ,
var ).
, var ?
. -, S
, , ESS, , ,
, ESS.
, var. -,
, .


var,
.
, .
f() ; 1 1 "["
functi on f ( ) {
consol e . log ( ' f ' ) ;

, ,
, .
, .

1 56 7 .
f() ; 1 1 TypeError : f -
let f = function ( ) {
console . log ( ' f ' ) ;


(Temporal Dead Zone - TDZ) -
, ,
let, .
,
.
,
TDZ, , JavaScript S.
t ypeof , ,
"" . ,
let TDZ,
.
if ( typeof "'== " undefined " ) {
console . log ( " x unde fined " ) ;
else {
1 1 . . . .

l e t
. , .
if ( t ypeof "'== "unde fined " ) {
console . log ( " x unde fined " ) ;
else {
/ ! . . . .

let = 5;

typeof S
, typeof
.


ESS (implicit global),
. ,
var, JavaScript
, .

1 57
, !
, .
( ) JavaScript
(strict mode), .
"use strict" (
),
, . ,
, ,
.
,
, .
- ,
.
. , ,
, ,
. ,
.
( ?),
( 1 3).
( function ( ) {
' use s t r i ct ' ;

// . . . ,
// ,
//
// ,
11
}) ();

, .
( !),
, !
,
MDN.


.
let JavaScript
. JavaScript - ,
, ( )
, . JavaScript
, JavaScript.

1 58 7 .
8

- JavaScript.
,
JavaScript
.
JavaScript.


, . (
) ,
. JavaScript , ..
( ,
r ).
,
. length,
. ,
, ,
unde f ined.
Array, . ,
, .
/ /
const arrl [ 1 , 2, 3 ] ; //
const arr2 [ " one " , 2, " three " ] ; / /
const arr3 [ [ 1, 2, 3] , [ "one " , 2 , " thre e " ] ] ; / / ,
1 1
const arr4 / /
{ name : " Fred " , type : " ob j ect " , luckyNumers = [ 5 , 7 , 1 3 ] } ,
[
name : " Susan " , t ype : " ob j ect " } ,
name : "Anthony" , t ype : " ob j e ct " } ,
]'
1,
funct ion ( ) { return " " ;
},
" three " ,
];

/ /
arrl [ O ] ; 11 1
arr1 [ 2 ] ; 11 3
arr [ l ] ; 11 [ " " , 2 , "three "]
arr4 [ 1 ] [ ] ; // { : "Susan " , type : "obj ect " }

/ /
arr l . l ength ; 11 3
arr4 . lengt h ; 11 5
arr4 [ 1 ] . length ; 11 2

/ /
arr 1 [ 4 ] = 5 ;
arr l ; / / [ 1 , 2 , 3 , undefined, 5 ]
arrl . lengt h ; 11 5

/ / ( ) , ,
/ / , **
arr2 [ 1 0 ] ; / / undefined
arr2 . lengt h ; 11 3

/ / Array ( )
const arrS new Array ( ) ; 1 1
const arr new Array ( l , 2 , 3 ) ; 1 1 [ 1 , 2 , 3 ]
const arr7 new Array ( 2 ) ; 1 1 2 (
1 1 undefined)
con s t arr8 new Array ( " 2 " ) ; 1 1 [ "2 "]


,
. , , ,
, " '',
, . ,
, (,
push , concat - ).

, Ruby, ,
,
. , Ruby, str
s t r . downcase,

1 60 8.
, s t r . ,
s t r . downcase ! , s t r .
, JavaScript
, ,
, ,
, .



, (
). (
arr . length-1 arr) . push
( ) . shi ft unshift
( ) .

.
(push) () - (stack),
, .
shift unshift (queue), -
, .

push unshift
, shift .
.
const arr = [ " " , " " , " d" ] ;
arr . push ( " e " ) ; 1 1 4 ; a rr [ " " ," " , "d " , " "]
arr . ( ) ; 11 ""; arr [ " " , "", "d"J
arr . unshi ft ( " a " ) ; 1 1 4 ; arr [ " ", " " , " " , "d "J
arr . shift ( ) ; 11 " "; arr [ " " , "", "d "]


concat .
concat ,
. .
const arr = ( 1 , 2 , 3 ] ;
arr . concat ( 4 , 5 , 6 ) ; 1 1 [1 , 2, 3 , 4 , 5 , 6] ; a rr
arr . concat ( [ 4 , 5 , 6 ] ) ; 1 1 [1 , 2 , 3 , 4 , 5 , 6) ; arr
arr . concat ( [ 4 , 5 ] 1 6) ; 1 1 [1 , 2 , 3 , 4 , 5 , 6) ; arr
arr . concat ( [ 4 , [ 5 , 6 ] ] ) ; 1 1 [1 , 2 , 3, 4 , [ 5 , 6] ] ; a rr

161
, concat ,
; .


, s l ice,
. - ,
- ( ).
, .

, . .
const arr = [1, 2, 3, 4, 5] ;
arr . sl i c e ( 3 ) ; 11 [ 4 , 5] ; arr
arr . s l i ce ( 2 , 4 ) ; 11 [3, 4 1 ; arr
arr . s l i ce ( -2 ) ; 11 [ 4 , 5] ; arr
arr . s l i ce ( l , -2 ) ; 11 [2, 3] ; a rr
arr . s l i ce ( - 2 , - 1 ) ; 11 [ 4 1 ; arr


s p l i c e , /
. - ,
; - (
, ), -
. .
const arr = [ 1 5 , 7 ] ;
/

arr . splice ( l , , 2 , 3 , 4 ) ; 11 [ ] ; arr [ 1 , 2, 3, 4 , 5, 7)


arr . splice ( 5 , , 6 ) ; 11 [ } ; a rr [ 1 , 2, 3, 4, 5, 6, 7]
arr . splice ( l , 2 ) ; 11 [2, 3] ; a rr [ 1 , 4 , 5, 6, 7]
arr . splice ( 2 , 1 , , 1 ,
'' ) ; 11 [ 5 ] ; arr [ 1 , 4, ' ' , ' ' , 6, 7]


S , copyWi thin,
, ,
, . -
, - , ()
- . s l ice,
;
. .
const arr = [ 1 , 2 , 3 , 4 ] ;
arr . copyWithin ( l , 2 ) ; / / arr [1 , 3 , 4 , 4 1

1 62 8.
arr . copyWithin ( 2 , , 2 ) ; 1 1 arr [ 1 , 3, 1 , 3 }
arr . copyWithin ( O , - 3 , - 1 ) ; 1 1 a r r [3, 1 , 1 , 3 }


S , f i l l,
( ). ,
Array (
).
, (
). .
const arr = new Array ( 5 ) . fill ( l ) ; 1 1 arr [ 1 , 1 , 1 , 1 , 1 }
arr . f ill ( " a " ) ; 1 1 arr [ " " ' " " , " " ' " " ' " " }
arr . fill ( "b " , 1 ) ; 1 1 arr [ " ", " " , " " ' " " , " " }
arr . fill ( " c " , 2 , 4 ) ; 1 1 arr [ " "' " " , '' " , " " ' " " }
arr . fill ( 5 . 5 , - 4 ) ; 1 1 arr [ " "' 5 . 5 , 5 . 5 , 5 . 5, 5 . 5}
arr . fill ( O , - 3 , - 1 ) ; 1 1 arr [ " "' 5 . 5 , , , 5 . 5]


reve rse , (
).
const arr = [ 1 , 2 , 3 , 4 , 5 ] ;
arr . reverse ( ) ; 1 1 arr [5, 4 , 3 , 2 , 1 }

sort ( ).
const arr = [5, 3 , 2 , 4 , 1 ] ;

arr . sort ( ) ; 1 1 arr [ 1 , 2, 3 , 4 , 5 }

sort (sort function),


. ,
.
const arr = [ { name : " Suzanne" } , name : " Jim" } ,
{ name : " Trevor" } , name : "Amanda" } ] ;
arr . sort ( ) ; 1 1 arr
arr . s ort ( ( a , ) => a . name > b . name ) ; 1 1 arr
1 1
1 1
arr . sort ( ( a , ) => a . name [ l ] < b . name [ l ] ) ; 1 1 arr
1 1
1 1
1 1

1 63
.
sort .
, sort ,
"'', . ,
, , ,
k.
, k,
j l, k
(.. ).


- , .
indexOf, JavaScript
. indexOf ,
( lastindexOf,
,
). ,
. indexOf ( last indexOf) -1,
, .
cost = { : 11 Jerry 11 } ;
cost arr = [ 1 , 5 , 11 11 , , true , 5, [ 1 , 2 ] , 11 9 11 ] ;
arr . indexOf ( 5 ) ; 1 1 1
arr . l a s t indexOf ( 5 ) ; 1 1 5
arr . idexO f ( 11 a 11 ) ; / / 2
arr . l a s t indexOf ( 11 a 11 ) ; // 2
arr . indexOf ( { : 11 Jerry 11 } ) ; 11 -1
arr . indexOf ( o ) ; // 3
arr . indexOf ( [ 1 , 2 ] ) ; 11 -1
arr . idexO f ( 11 9 11 ) ; 11 7
arr . idexOf ( 9 ) ; 11 -1
arr . idexOf ( 11 a 11 , 5 ) ; // -1
arr . idex0f ( 5 , 5 ) ; 11 5
arr . l a s t idexOf ( 5 , 4 ) ; // 1
arr . l a s t idexOf ( true , 3 ) ; 11 -1

, f indindex indexOf ,
( - 1 ), .
, , ( f indindex
lastindexOf).
cost arr = [ { id : 5 , : 11 Judith 11 } , { i d : 7 , : 11 Francis 11 ) ] ;
arr . findindex ( o => o . id === 5 ) ; / /
a rr . findindex ( o = > . === 11 Fracis 11 ) ; / / 1

1 64 8.
arr . findindex ( o = > === 3 ) ; 1 1 -1
arr . findindex ( o = > o . id === 1 7 ) ; // -1

find findi ndex .


, ? find
findindex , ,
, ( nul l, ).
const arr = [ { i d : 5 , name : " Judit h " } , { i d : 7 , name : " Franc i s " } ] ;
arr . find ( o = > o . id 5 ) ; / / ( id: 5 , : "Judi th "
arr . find ( o > o . id === 2 ) ; / / null
=

, find findindex, ,
,
. , ,
, .
const arr = [ 1 , 1 7 , 1 6 , 5 , 4 , 1 6 , 1 0 , 3 , 4 9 ] ;
arr . find ( ( , i ) => i > 2 && Nurne r . i s i nteger ( Ma t h . sqrt ( x ) ) ) ; / / 4

find findindex this


. ,
, .
Person .
class Person {
constructor ( name )
t hi s . name = name ;
this . id = Person . next id++ ;

Person . next i d =;
const j amie new Person ( " Jamie " ) ,
j ul i e t new Person ( " Ju l ie t " ) ,
peter new Person ( " Peter" ) ,
j ay new Person ( " Jay " ) ;
const arr = [ j amie , j ul i e t , peter, j ay ] ;

/ / 1 : :
arr . find ( p = > p . id j ul i e t . id ) ;
=== / / j ul i e t

/ / 2 : "this " :
arr . find ( p = > p . id this . id , j ul i e t ) ; / / j ul i e t
===

, , thi s
find findindex, ,
.

1 65
, ,
: ,
. ,
, - 1 null, JavaScript : some
every.
some t rue, ,
( , , ) , fa l s e
. .
const arr = [ 5 , 7 , 1 2 , 1 5 , 1 7 ] ;
arr . some ( x => % 2===0 ) ; / / true; 1 2
arr . some ( x => Numer . i s integer ( Math . sqrt ( x ) ) ) ; // fal s e ;

eve ry t rue,
, false . false,
, ;
.
const arr = [ 4 , 6, 1 6 , 3 6 ] ;
arr . every ( x => % 2 === 0 ) ; // true;
arr . every ( x => Numer . i s i nteger ( Math . sqrt ( x ) ) ) ; / / fa lse; 6 -

, , s ome
every , this
.

n
: map f i l ter
map f i l t e r .
, .
map . ? .
, , ? !
, ? ! ,
, ,
map. map f i l ter .
.
const cart = [ { name : "Widget " , price : 9 . 95 } , { name : " Gadge t " , price : 2 2 . 9 5
}];
const names = cart . map ( x => x . name ) ; // [ "Widget ", "Gadget "J
const prices = cart . map ( x => x . price ) ; // [ 9 . 95 , 22 . 95 ]
const discountPrices = price s . map ( x => * . 8 ) ; // [ 7 . 96, 1 8 . 3 6}
const l cNames = name s . map ( String . toLowerCa se ) ; // [ "widge t " , "gadget "]

1 66 8.
" l cNames?
, ': , ,
map, , .
names, prices discountPrices (
). l cNames , ,
String . toLowerCase. ,
. names . map ( = >
. toLowe rCase ( ) ) , , - ,
, .
.
: , (
). ,
, .
const i tems = [ "Widge t " , " Gadget " J ;
const prices = [ 9 . 95 , 22 . 9 5 ) ;
const cart = i t ems . map ( ( x , i ) => ( { name : , price : prices [ i ] } ) ) ;
1 1 cart : [ ( : "Widge t " , price : 9 . 95 } , ( : "Gadge t " , price : 22 . 95 } ]

, map.
, (), ( i ) .
, i tems
prices . map
, . ( ,
;
.)
filte r, ,
. map,
. ? .
, ,
. .
1 1
const cards = ( ] ;
for ( le t suit of [ ' ' , ' ' , ' D ' , ' S ' ] ) 1 1 , , ,
for ( le t value=l ; value<= l ; value+ + )
cards . push ( { suit , value } ) ;

1 1 2 :
cards . fi l t e r ( c => c . value === 2 ) ; 1 1 [
1 1 ( sui t : ' ' ' val u e : 2 } '
' '
1 1 ( sui t : ' val u e : 2 } '
1 1 ( s ui t : 'D , ' val u e : 2 } '
1 1 ( sui t : , s , , val u e : 2 }

: map filter 1 67
11 ]

/ / ( )

/ / :
cards . fi l t e r ( c => c . suit 'D' ) ; 1 1 : 1 3

/ /
cards . fi l t e r ( c => c . va lue > 1 0 ) ; 1 1 : 1 2

/ /
cards . fi l t e r ( c = > c . value > 1 0 & & c . suit === ' ' ) ; / / : 3

, , map filter
. , ,
.
"\.', "J", "Q" "" .
,
.
function cardToString ( c )
const suits = { ' ' : ' \u 2 6 6 5 ' , ' ' : ' \u2 6 63 ' , ' D ' : ' \u2 6 66 ' , ' S ' : ' \u2 6 6 0 '
};
const values = { 1 : ' ' , 1 1 : ' J ' , 1 2 : ' Q ' , 1 3 : ' ' } ;
/ / cardToString
/ / ;
for ( le t i=2 ; i<=l O ; i + + ) value s [ i ) = i ;
return value s [ c . va lue ] + suits [ c . su it ] ;

/ / 2 :
cards . fi l t e r ( c = > c . va lue === 2 )
. map ( cardToString ) ; 1 1 [ 2'1 , 2 , 2+ , 2 ]

/ /
cards . fi lter ( c => c . value > 1 0 & & c . suit === ' ' )
. map ( cardToString ) ; / / [ J'I , Q'I , K'I

r : reduce
reduce. map
-

, reduce .
reduce , (reduce)
. , , ,
.

1 68 8.
-
reduce map f i l t e r (
, ).
reduce, map fi lter, ,
.
(callback),
. reduce - (accumulator),
. :
, .
, reduce ()
. -
.
const arr = [ 5 , 7 , 2 , 4 ] ;
const sum = arr . reduce ( ( a , ) => += , 0 ) ;

reduce : ()
().
. reduce, ,
JavaScript, , .
1 . (5) () .
, , - 5.
(5), .
2. (7).
5 ( ), 7 .
(12), .
3. (2).
12, - 2. ( 1 4 ) .
4. , , ( 4 ).
. 1 4 , - 4 .
( 1 8 ) , reduce (
sum) .

,
; ,
(, r e turn ) ,
, + .
.
, - .

: reduce 1 69

reduce, , ,
, .. unde f i ned. reduce

. ,
.
const arr [ 5 , 7, 2 , 4 ) ;
const sum arr . reduce ( ( , ) => += ) ;

1 . ( 7 ) () .
5 ( ), 7 .
( 1 2 ),
.
2. (2).
12, - 2. ( 1 4 ).
3. , , ( 4 ).
1 4, - 4 .
( 1 8 ) , reduce (
sum) .

, , .
( ,
) , .
reduce
( ), -
( ). ,

( , ..), .
const words = [ "Beachba l l " , "Rodeo" , "Ange l " ,
"Aardvar k " , "Xylophone " , "Novemer " , "Chocolate " ,
" " , "Uni form" , "Joker" , "Clover" , "Bal i " ] ;
const alphabetical = words . reduce ( ( a , ) => {
if ( ! a [x [O ] J ) a [x [ OJ J = [ ] ;
[ [ 0 ] ] . push ( ) ;
return ; } , { } ) ;

, .

; , (
" Be a chba l l " . ,
). (, ,
) , ( ) (,

1 70 8.
, ,
).
- . , ,
.
con s t data = [ 3 . 3 , 5 , 7 . 2 , 1 2 , 4 , 6 , 1 0 . 3 ] ;
11 :
11 , 2 . , 3 - . 2000
cons t stats = dat a . reduce ( ( a , ) => {
a . N++;
let de l t a =
- a . me a n ;
a . mean + = delta / a . N ;
. 2 + = del t a * ( x - a . me an ) ;
return ;
} , { N : , mean : , 2 : } ) ;
i f ( st a t s . N > 2 ) {
stats . variance = s t at s . M2 / ( st a t s . N
- l) ;
stat s . stdev = Math . s qrt ( st a t s . variance ) ;

,
( - mean 2: N
).
, reduce
, , - .
cons t words = [ "Beachbal l " , " Rodeo " , "Ange l " ,
"Aardvark" , "Xylophone" , "Novemer " , "Chocol a t e " ,
" " , " Uni form" , " Jo ke r " , " Clove r " , "Bali " ] ;
const longWords = words . reduce ( ( , w } => w . length> ? + " " +w : , " " } . trim ( } ;
11 longWords : "Bea chba l l Aardvark Xyl ophone November Chocol a t e Uniform"

,
, .
, reduce
filter j oin ( ). ( "
trim reduce?")
, reduce.
.

171
. map, filter reduce
, . ,
S, ,
.
const arr = Array ( l O ) . map ( functi on ( x ) { return 5 } ) ;

arr 1 0 ,
undefined. , ,
map, "':
cons t arr = [ 1 , 2 , 3 , 4 , 5 ] ;
del e t e arr [ 2 ] ;
arr . map ( x => ) ; // [ , , < >, , ]

,
, (
, , delete
), .


()
, . Arra . protot . j oin
, ( - , ),
(
; null unde fined
).
con s t arr = [ 1 , null , "hel l o " , "world" , true , undefine d ] ;
del e t e arr [ ] ;
arr . j oi n ( ) ; 11 "1 , , hello, , true, "
arr . j oin ( ' ' ) ; / / "lhellotrue "
arr . j oin ( ' -- ' ) ; / / "1 -- -- hello -- -- true "

(
) Array . prototype . j oin ,
HTML <ul>.
con s t attribute s = [ "Nime " , " Perceptive " , " Generous " J ;
cons t html = ' <ul><l i> ' + a t t r ibut es . j oin ( ' < / l i><l i > ' ) + ' < / l i></ul> ' ;
/ / h tml : "<ul><li>Nime</l i><li>Percep t i ve</ l i><li>Generous</ l i></ul> " ;

, :
<li>!

1 72 8.

JavaScript Array ,
, .
Array . 8. 1 -8.4.
Arra y . prot otype, ( find, findindex,
some, every, map, f i l t e r reduce ) , ,
. 8 . 1 , .
8.1 . ( )

reduce ( ,
)
( )

( )

Array . prototype, ,
this, ,
.

8.2.
". ".

(" , push ( ),
" [LIFOJ)
(" , unshift ( ),
" [FIFO]) shift
concat

s lice
spli ce

copyWithin

fill
reverse
sort ( -
)
8.3.
/". ".
indexOf ( ), findlndex (
)
lastindexOf ( )
f ind
, - s ome

- every

8.4.
". ."
map
f i lter

reduce
j oin

1 74 8.
9

JavaScript 3,
.
, JavaScript - ,
.
.
, ;
, .
( arr [ ] arr [ 1 ] );
( , obj
.

obj . ).

( ) ,
, .
(property) (key) ( ) (value).
, .


, (
), , .
, ;
.
, , - ,
. , ,
, ,
. JavaScript
,
.
, .
,
.

for . . . in
for . . . in.
,
.
const SYM Symol ( ) ;

const = : 1 , : 2, : 3, [ SYM] : 4 } ;

for ( le t prop i n ) {
i f ( ! o . hasOwnProperty (prop) ) cont inue ;
conso l e . log ( ' $ { prop } : $ { o [ prop] } ' ) ;

. . . , ,
" hasOwnPrope rty?" ,
for . . . in, .
. . ,
( , ),
, .
hasOwnProperty.
, , ,
( ) .
, for . . . in
.

for . . . i n
, .
for forEach.
-----_J
Obj ect . keys
Obj ect . keys
.
const SYM Symol ( ) ;

cons t = : 1, : 2, : 3, [ SYM] : 4 } ;

Obj e c t . keys ( o ) . forEach ( prop => console . log ( ' $ { prop } : $ { o [ prop] } ' ) ) ;

1 76 9. -
, for . . . in (
hasOwnProperty). ,
. ,
, .
const = { appl e : 1 , xochit l : 2 , balloon : 3 , guitar : 4 , xylophone : 5 , };

Obj ect . keys ( o )


. fi lter ( prop => prop . match ( / x/ ) )
. forEach ( prop => console . log ( ' $ { prop } : $ { o [ prop ] } ' ) ) ;

-
- (, Obj ect-Oriented
Programming) - . ,
, 1 950- ,
Simula 67 Smalltalk .
: -
.
. , (,
-

, , (VIN) ..),
(, , ,
..). , ()
( ).
, .
(class) (), (instance) (
(object instance)) - (
, " "). ()
(method). , ,
, (, " VIN"
:
, , ,
, VIN). ,
(constructor). .

. , .
(,
),
(, ,
, ). , -
(superclass) , - (subclass)
.
: , , , , ..

- 1 77
, , . ,

, , , , ..
,
, , .


S JavaScript
. .
class Car {
const ructor ( )
}

Car. (
) , .
, new.
cons t carl new Car ( ) ;
const car2 = new Car ( ) ;

Car. Car
, instanceof, ,
.
carl instanceof Car // true
carl instanceof Array // fa lse

, carl Car, Array .


- -

Car . (
, ) ( ).
class C a r {
constructor ( ma k e , mode l )
this . make = ma ke ;
this . model = mode l ;
this . u s e rGears = [ ' ' , ' N ' , ' R ' , ' D ' J ;
this . us erGear = thi s . us erGears [ O ] ;

shift ( ge a r ) {
i f ( this . userGears . indexOf ( ge a r ) < 0 )
throw new rrr ( ' : $ { gear } ' ) ;
thi s . u s e rGear = gear;

this :
, . :

1 78 9 . -
, , , this
,
.
, :
(userGears) (gear),
. (
(user gears) ,
, , ,
.)
( ),
shi ft, . .
const carl = new Car ( " T e s la " , "Model S " ) ;
const car2 = new Car ( "Mazda " , " i " ) ;
carl . shift ( ' D ' ) ;
car2 . shift ( ' R ' ) ;

, carl . shi ft ( ' D ' ) , this


carl. car2 . shift ( ' R ' ) car2.
, carl D (drive), car2
R (reverse).
> carl . userGear // "D "
> car2 . userGear / / "R "


, shi ft Car
, .
, ,
: carl . userGear = ' ' . -
,
,
. JavaScript , .
1 .
.
Car , .
c l a s s Car {
constructor (make , model )
thi s . ma ke = make ;
thi s . model = model ;
thi s . _userGears = [ ' ' , 'N' , 'R' , ' D' ] ;
thi s . _userGear = thi s . _us erGears [ O ] ;

1 (accessor
properties), 2 1 .

- 1 79
get userGea r ( ) { return thi s . userGea r ;
s e t userGea r ( value ) {
i f ( this . _use rGears . indexOf ( value ) < 0 )
throw new rrr ( ' : $ { value ) ' ) ;
t hi s . use rGear value ;
=

shift ( ge a r ) { thi s . us erGear = gea r ; )

, ,
_userGear : carl . _userGear =
' ' . " " - ,
, .
,
, .
,
WeakMap (. 1 0),
( WeakMap,
, ,
, ).
, Car .
const Car = ( function ( ) {

const carProps = new W e a kMap ( ) ;

c l a s s Car {
constructor ( ma ke , mode l )
thi s . ma ke = ma ke ;
t hi s . model model ;
=

thi s . _userGears = [ ' ' , ' N ' , ' R ' , ' D ' ] ;
carProps . set ( th i s , { userGea r : t hi s . userGears [ ] ) )
_ ;

get userGear ( ) { return carProps . ge t ( th i s ) . userGear ;


s e t userGear ( value ) {
i f ( this . _userGears . indexOf ( value ) < 0 )
throw new rrr ( ' : $ { value ) ' ) ;
carProps . get ( th i s ) . us erGear = value ;

shift ( ge a r ) { thi s . userGear gea r ; )

return C a r ;
}) ();

1 80 9. -
WeakMap ,
,
(. 13). Weakap ,
.
,
;
, , ,
.


S class
, . class
, JavaScript
( class
), , JavaScript.
- . ESS
Car .
funct ion Car (ma ke , mode l )
thi s . make =ma ke ;
t h i s . model mode l ;
=

t hi s . _userGears = [ ' ' , ' N ' , ' R ' , ' D ' ] ;


thi s . _userGear = thi s . userGears ( O J ;

S - (
). , .
class E s Car { } 1 1
function E s5Car { }
> typeof E s Car 1 1 "funct ion "
> t ypeof E s5Car 1 1 "fun c tion "

, S ;
.


, ,
(prototype) . , shift,
Car,
Car . prototype . shift. ( forEach Array
Arra y . prototype . forEach. )
, JavaScript ( dynamic
dispatch), (prototype chain).

- 181
( # )
. ,
Car . prototype . shift, Car # shift.

prototype. (
f, f . prototype.)
, ,
.
(
- ) , Car.
- , ,

- .
prototype ,
new:
protot .
_proto_
proto JavaScipt,
,
. , ,
. ,
JavaScript,
( ) .
( "dispatch" -

).
, , JavaScript ,
, .
, ,
, .

.
.
- ,
, , -
.
, .
,
; , JavaScript ,
- . .

1 82 9. -
1 1 Ca r shift
const carl = new Car ( ) ;
const car2 = new Car ( ) ;
carl . shift === Car . prototype . shift ; / / true
carl . s hift ( ' D ' ) ;
carl . s hift ( ' d ' ) ; 1 1
carl . userGear ; / / 'D '
carl . shift === car2 . shift 1 1 true
carl . shift = function ( ge a r ) thi s . use rGear gear . toUpperCas e ( ) ; }
carl . s hift === Car . prototype . shift ; / / fa lse
carl . shift === car2 . shift ; / / fa lse
carl . s hift ( ' d ' ) ;
carl . userGear ; / / 'D '

, JavaScript .
carl shi ft, car l . shift ( ' D ' )
JavaScript carl .
shift , carl
. carl . shift ( ' d ' ) ,
carl, .

, ,
. , , .


, ,
(instance method). .
(static method) ( (class method)),
.
this ,
.
,
, .
VIN ( ).
VIN:
VIN,
? VIN ,
; , .
,
(). ,
areS irnilar, t rue,
, areSarne, t rue,
VIN. , Car.

- 1 83
class Car {
static getNextVin ( )
return Car . nextVin + + ; / /
/ / this . nextVin+ + , Car
/ / ,

const ructor (make , model )


thi s . ma ke = make ;
thi s . model = mode l ;
thi s . vin = Car . getNextVin ( ) ;

s t a t i c areSimilar ( car l , car 2 ) {


return carl . ma ke===car2 . ma ke && car l . model===car2 . mode l ;

s t a t i c areSame ( carl , car2 ) {


return carl . vin===car2 . vi n ;

Car . nextVin = ;

const carl new Car ( " Te s la " , " S " ) ;


const car2 new Car ( "Mazda " , " 3 " ) ;
const car3 new Car ( "Ma zda " , " 3 " ) ;

car l . vin; //
car2 . vi n ; // 1
car3 . vin // 2

Car . areSimi lar ( ca r l , car2 ) ; 11 fa lse


Car . areSimil a r ( car2 , car3 ) ; 11 true
Car . areSame ( car2 , car3 ) ; 11 fa lse
Car . areSame ( car2 , car2 ) ; 11 true


, :
, .
: ,
. . JavaScript
, , .
, .
. ,
- .
, . ,
deployAi rbags.
, - ?
, ;
, addPas s enger (

184 9 . -
, ). ,
JavaScript.
class Vehicle {
constructor ( ) {
t his . pas sengers = [ ] ;
consol e . log ( " Tpacopoe " ) ;

addPa s s enge r ( p ) {
this . p a s sengers . push ( p ) ;

class Car extends Vehicle


constructor ( )
super ( ) ;
nsl . lg ( " " ) ;

deployAirbags { ) {
console . log ( " ! ! ! " ) ;

, , - extends;
, Car Vehicle.
super ( ) . JavaScript,
. ;
, .
.
const v = new Vehicle ( } ;
v . addPassenge r ( " Frank" ) ;
v . addPas s enge r ( " Judy" ) ;
v . passengers ; 1 1 [ "Frank " , "Judy "J
const = new Car { ) ;
c . addPas s enger ( "Alice " ) ;
c . addPas s enge r ( " Cameron " } ;
c . passenge r s ; 11 [ "A l i ce " , "Cameron "]
v . deployAirbags ( } ; 11 =
c . deployAirbags ( } ; 1 1 " ! ! ! "

, deployAirbags , v.
, .
Car Vehicle, .

(polymorphism) -
,

- 1 85
, . -
- ,
. JavaScript , ..
( ).
, JavaScript .
JavaScript, ,
(duck typing). "
, , , , , , ,
': Car, ,
deployAi rbags, , Car.
, , .
JavaScript instanceof, ,
. , ,
prototype _proto_,
.
class Motorcycle extends Vehicle { }
const = new Car ( ) ;
const m = new Motorcyle ( ) ;
instanceof Car ; 1 1 true
instanceof Vehicl e ; 1 1 true
m instanceof Car; 1 1 false
m instanceof Motorcycle ; 1 1 true
m instanceof Vehicle ; 1 1 true

JavaScript
Obj ect. ,
instanceof Obj ect (
_proto_, ).
,

. toSt ring,
.

( }
, for . . . in. ,
,
hasOwnProperty .
obj obj . hasOwnProperty ( ) t rue, obj
, false, .
ES6 , ,
, . ,

1 86 9 . -
,
, hasOwnProperty,
. .
cla ss Super {
const ructor ( ) {
this . narne = ' Super ' ;
this . i s Super = true ;

1 1 , . . .

Super . prototyp e . sneaky = ' ! ' ;

class Sub extends Super


constructor ( ) {
super ( ) ;
this . narne ' Sub ' ;
t hi s . i sSub = t ru e ;

const obj = new Sub ( ) ;

for ( le t in obj ) {
console . log ( ' $ { p ) : $ { obj [ ] } ' +
( obj . hasOwnPropert y ( p ) ? ' ( ) ' ) ) ;

,
narne : Sub
i sSuper : true
i sSub : true
sneaky : ! ( )

name, i sSuper i sSub ,


( , , ,
). sneaky,
, .
, Obj ect . keys,
, .


Obj ect. ,
, Obj ect, .
toSt ring,

1 87
. toString
11 [ obj ect Obj ect ] 11, .
toString, ,
,
. , Car ,
toString , VIN.
c l a s s Car {
toString ( )
return ' $ { th i s . ma ke } $ { t hi s . mode l } : $ { this . vi n } ' ;
}
// . . .

toString Car
.

,
-
(multiple inheritance),
( , , ,
). (collision) .
,
g reet, ?
, .
,
. ,
, " " ( ,
, , , - ). ,
,
(interface), . (Car)
(Vehicle), (Insurale,
Container ..).
JavaScript - . ,
,
,
, ( - ).
-
(mixin). ""
. JavaScript
,
.

1 88 9 . -
"",
. ,
InsurancePol i cy.
addinsurancePolicy, get insurancePolicy ( ) i s insured.
, .
class I n s urancePolicy ( ) { }
function makeinsural e ( o ) {
o . addinsurancePolicy = function ( p ) { thi s . insurancePolicy = ; }
o . get insurancePolicy = function ( ) { return thi s . insurance Policy;
. i s i nsured = function ( ) { return ! ! thi s . insurancePo l i c y ; }

.
Car?
.
ma keinsural e ( Ca r ) ;

.
const carl new Car ( ) ;
=

carl . addinsurancePol icy ( new InsurancePolicy ( ) ) ; / /

", addinsurancePolicy
': . Car
. , :
, - .
, .
const carl new Car ( ) ;
=

make insurale ( car l ) ;


carl . addinsurancePo l i cy ( new I nsurancePol icy ( ) ) ; / /

, ma ke i n s urae
.
Car,
. , .
makeinsural e ( Car . prototype ) ;
const carl = new Car ( ) ;
carl . addi nsurancePo li cy ( new I n s urancePolicy ( ) ) ; / /

, Car.
JavaScript .
.
Car, InsurancePolicy
makeinsurae. ,
, Car.

, 1 89
: -
shi ft,
Car. , instanceof
, :
( addinsurancePolicy, , ,
).
, . ,
,
Car.
. .
class InsurancePol i cy ( ) { }
const ADD_POLICY =Symol ( ) ;
const GET_POLICY =Symol ( ) ;
const I S_ INSURED =Symol ( ) ;
const POLICY = Symol ( ) ;
function makeinsural e ( o ) {
o [ADD_POLICY] function ( p ) { thi s [ POLICY] = ; }
o [GET_POLICY] function ( ) { return this [ POLICY] ;
o [ I S INSURED] funct ion ( ) { return ! ! this [ POLI CY ] ;

, ,
Car.
, . ,
, , (
, POLI CY) .


- -
.
, ,
. JavaScript -
, JavaScript
- ( -
). , ,
JavaScript , .
, -
.

1 90 9 . -
1 0

S : (map)
(set). ,
, ,
.

S, ,
,
.
.
, , ,
.
,
.
,
.
.


( - ). , ,
, .
const ul name : ' Cynthia ' };
const u2 name : ' Jackson ' };
const u name : ' Ol ive ' } ;
const u4 name : ' Jame s ' } ;

.
const u s e rRole s = new ( ) ;

set ( ) .
userRole s . set ( u l , ' Us er ' ) ;
userRole s . set ( u2 , ' Us er ' ) ;
userRole s . s e t ( u , ' Admin ' );
/ / . . .

set ( ) , .
userRole s
. se t ( u l , ' Us er ' )
. se t (u2 , ' Us er ' )
. se t ( u , ' Admin ' ) ;

.
const userRol e s new ( [
=

[ u l , ' Us er ' ] ,
[u2 , ' Us er ' ] ,
[ u , ' Admin ' ] ,
]);

, u2,
get ( ) .
userRole s . ge t ( u2 ) ; 1 1 "User "

get , ,
undefined. , has ( )
.
userRo l e s . ha s ( ul ) ; 1 1 t rue
userRole s . ge t ( u l ) ; 1 1 "User"
userRoles . ha s ( u4 ) ; 1 1 fa lse
userRole s . ge t ( u4 ) ; 1 1 undefined

s e t ( ) , ,
.
userRole s . ge t ( ul ) ; // ' User '
userRole s . set ( ul , ' Admin ' ) ;
userRole s . ge t ( ul ) ; / / 'Admin '

s i ze .
userRole s . s i z e ; 11 3

key s ( ) , values ( ) -
, entries ( ) - ,
- , - .
, for . . . of.

1 92 1 0.
for ( le t of userRole s . keys ( ) )
console . log ( u . name ) ;

for ( le t r of userRoles . value s ( } )


console . log ( r ) ;

for ( le t ur of userRol e s . entrie s ( ) )


console . log ( ' $ { ur [ ] . name } : $ { ur [ 1 ] } ' ) ;

1 1 :
1 1 , :
for ( le t [ u , r ] of userRoles . entr i e s ( ) )
console . log ( ' $ { u . name } : $ { r } ' ) ;

/ / entries () ,
-

/ / :
for ( le t [ u , r] of userRoles )
console . log ( ' $ { u . name ) : $ { r } ' ) ;

,
.
[. . . userRole s . va lues ( ) ] ; / / [ "User " , "User " , "Admin " ]

, delete ( ) .

userRoles . de l e t e ( u2 ) ;
userRoles . s i z e ; 11 2

, ,
, clear ( ) .
userRoles . clear ( ) ;
userRole s . s i z e ; 11


Weakap , .
.
Weakap .
Weakap .

JavaScript , - .
, , , JavaScript
, . Weakap
. - WeakMap (

1 93
, ,
).
WeakMap
.
const SecretHolder = ( functi on ( )
const secrets = new Weakap ( ) ;
return class {
s e t Secret ( secre t ) {
s ecret s . set ( th i s , secret ) ;

getSecret ( ) {
return secrets . ge t ( th is ) ;

}) () ;

WeakMap
(IIFE) , . IIFE
SecretHolde r, .
, setSecret,
- getSecret.
const new SecretHolder ( ) ;
const = new S e cretHolder ( ) ;

a . setSecret ( ' s e cret ' ) ;


b . s e t S e cret ( ' s ecret ' ) ;

a . getSecret ( ) ; 1 1 "secret "


b . getSecret ( ) ; 1 1 "secret "

,
SecretHolder !

(set) - , .
,
. , "User",
- " U s e r " , "Adrnin".
. -
.
Set.
const role s = new Set ( ) ;

1 94 10.
,
add ( ) .
role s . add ( " U s e r " ) ; / / [ 11User11 ]

, add ( ) -
.
rol e s . add ( "Admin " ) ; / / [ "User " , "Admin "

, Set s ize.
roles . si z e ; 11 2

, ,
, . ,
, .
role s . add ( " U s e r " ) ; 1 1 "Us er " , "Admin " ]
roles . si z e ; 11 2

, delete ( ) ,
true, , false - .
roles . delete ( "Admin " ) ; 1 1 true
role s ; / / [ "User " J
roles . de l et e ( "Admin " ) ; / / fa lse


,
. Weakap, WeakSet ,
.
-
, .
, WeakSet naught y (
), , .
const naughty = new WeakSet ( ) ;

const children [ =

name : " Suzy" } ,


name : " Derek" } ,
];

naught y . add ( children [ l ] ) ;

for ( let child of childre n )


if ( naughty . ha s ( child) )

1 95
console . log ( ' Yo $ { child . name } ! ' ) ;
else
console . log ( ' oap $ { ch i l d . name } ! ' ) ;

1
- JavaScript, S,
, .
, ,
. ,
! , ,
;
. , : "
, ?" - "':
.

1 "Breaking the Hablt" - Linkin Park. - . .

1 96 10.
1 1

, .
,
, . ,
- , .
- .
(exception handling) - ,
. ,
(error handling), ,
, .. , ,
.
()
. ,
,
, ,
.

: .

.

Error
JavaScript E rror,
( ). E r ror,
.
const err = new rrr ( ' ema il ' ) ;

E rror .
. ,
. ,
. ,
E rror. , @ ,
(. 1 7) .
functi on validateEmai l ( emai l )
return ema i l . match ( /@ / ) ?
emai l :
new rrr ( ' ema i l : $ { emai l } ' ) ;

, E rror,
typeof.
mes sage.
const emai l = " j ane@doe . com" ;

cons t validatedEmai l = validateEma i l ( emai l ) ;


i f ( validat edEmai l ins tanceof Error ) {
console . error ( ' Oa : $ { va l idatedEma i l . me s sage } ) ;
else {
nsl . lg ( ' ema i l : $ { validatedEmail } ' ) ;


E rror, ,
.


try tch
try . . . catch.
, "" (try) - ,
- , "" (catch). validateEma i l
,
@ ,
:
email . ,
emai l null, ( , )
. ,
.
try . . . catch.
const ema i l = nul l ; 1 1

try {

1 98 11.
const validatedEma i l = val idateEma i l ( emai l ) ;
i f ( va l idatedEma i l instanceof Error ) {
console . error ( ' Oa : $ { validatedEma i l . me s sage } ) ;
else {
nsl . lg ( ' ema i l : $ { va l i datedEmai l } ' ) ;

catch ( err) {
console . error ( ' Oa : $ { err . me s sage } ' ) ;

,
.
. ,
? ,

.
, catch,
; .. i f, va l idateEmai l ( ) ,
. t ry , ;
, , catch.
, catch , .


t ry . . . catch
, JavaScript (
match -, ).
,
.
, JavaScript
: ,
. throw Error.
catch E rror. ,
,
(, , ,
, throw
Error) .
, ,
, (
,
, ).

1 99
function b i llPay ( amount, , account )
i f ( amount > a ccount . balance )
throw new Error ( "Mao . " ) ;
accoun t . t rans fer ( payee , amount ) ;

t hrow
. account . t rans fer ,
.


, , ,
, - ..
JavaScript . ,
, , ,
, ,
. , , "':
, ,
(call stack).
,
, ,
, .
, ,
. , ,
.

. , JavaScript
. ( unhandled
exception) (uncaught exception),
. ,
, ,
, .
,
. ,
, ,
, ,
, ,
. ,
.

200 11.
JavaScript E rror
s tack, (
JavaScript, ). ,
, .
function ( ) {
console . log ( ' : ' ) ;
() ;
console . log ( ' a : ' ) ;

func t i on ( ) {
console . log ( ' : ' ) ;
() ;
console . log ( ' b : ' ) ;

func t i on ( ) {
console . log ( ' c : ' ) ;
throw new Error ( ' c ' ) ;
console . log ( ' c : ' ) ;

func t i on d ( ) {
console . log ( ' d : ' ) ;
() ;
console . log ( ' d : ' ) ;

try
();
catch ( err)
console . log ( err . s t a ck ) ;

try
d() ;
catch ( err)
console . log ( err . s t a c k ) ;

Firefox .
:
:
:
c@debugger eva l code : l : l
b@debugger eva l code : 8 : 4
a@debugger eva l code : 3 : 4
@ debugger eva l code : 2 3 : 4

201
d :
:
c@debugger eval code : l : l
d@debugger eval code : 1 8 : 4
@debugger eval code : 2 9 : 4

@ , "
" () ( ).
, . ,
, , , . ,
d.

try . . . catch . . . finally


t ry ,
.
, .
try ,
, t ry
( ,
). catch,
, . ,
finally, .

, fina l l y
console . log.
try
console . log ( " a m . . . " ) ;
throw new Error ( "Yc ! " ) ;
consol e . log ( " m . . . " ) ;
catch ( err) {
console . l o g ( " . . . " ) ;
finally {
console . log ( " . . . cea " ) ;
console . log ( " m " ) ;

throw ; ,
finally .

202 11.

, , ,
-
, . , ,
"", ,
. . ,
( ),
.
"" , catch,
JavaScript .

,
.
, , ,
( ).
.
, ,
,
.

203
1 2

S :
(iterator) (generator). ,
.
: , . -
(iterae) : (
) ( ).
: , book
(), - , .
"Twinkle, Twinkle, Little Bat" (
, !1) (,
, ).
const book = [
" Twinkl e , twinkle , l it t l e bat ! " ,
" How I wonder what you ' re a t ! " ,
" Up above the world you f l y , " ,
" L i ke tea tray in the s ky . " ,
" Twinkl e , twink l e , l it t l e bat ! " ,
" How I wonder what you ' re at ! " ,
];

, book, ,
values.
const it = boo k . values ( ) ;

, ( it )
, . ,
. " ",
next , :
value, "", done,
t rue , . -
, ,
.

1 . - . .
i t . next () ; 11 va l u e : "Twinkle, t winkle, l i t tle ba t ! " , don e : fa lse }
i t . next () ; 11 va l u e : "How I wonder wha t you ' re a t ! " , done : fa lse }
i t . next () ; 11 va l u e : " above the wor ld you f1 , ", done : fa lse }
i t . next () ; 11 va l u e : "Like t ea tray in the sky. " done : fa lse }
'

i t . next () ; 11 va l u e : "Twinkl e , twinkle , l i t tl e ba t ! " , done : fa lse


i t . next () ; 11 va l u e : "How I wonder wha t you ' re a t ! " , done : fa lse }
i t . next () ; 11 va l u e : undefined, don e : true
i t . next () ; 11 va l u e : undefined, don e : true
i t . next () ; 11 va l u e : undefined , don e : true

, .
, next ,
, . :
, , , ?
, , .
, value unde fined
next .
,
, .2
,
, i t . next ( ) .
, i t .
, for for . . . of.
for : ,
,
. for . . .
? : for . . . of
t , . ,
. ,
for . . . of, while .
const it = book . values ( ) ;
l e t current = i t . next ( ) ;
while ( ! current . done ) {
console . log ( current . value ) ;
current = i t . next ( ) ;

, , .. ,
,
, .

2 ,
, " ':
done ; . ,
.

206 12.
const i t l = book . values ( ) ;
const i t 2 boo k . values ( ) ;
=

1 1

1 1 i tl :
i t l . next ( ) ; / / { va l u e : " Twinkle, twinkle, l i t t l e ba t ! ", don e : fa lse }
i t l . next ( ) ; / / { va l u e : "How I wonder wha t you ' re a t ! " , don e : fa lse }

1 1 i t 2 :
i t 2 . next ( ) ; / / { va l u e : " Twinkl e , t wink l e , l i t t l e ba t ! ", don e : false }

1 1 i tl :
i t l . next ( ) ; / / { va l u e : " above the world you fly, ", don e : false }


: - ,
. (iterator protocol)
. ,
r , .
.
class Log {
con s t ructor ( ) {
this . me s s ages [] ;

add ( me s sage ) {
this . messages . push ( { me s sage : mes sage , t ime stamp : Dat e . now ( ) });

".
(.. )? ,
log . me s s ages, ,
log , , ?
. ,
Symol . iterator, (..
next, value done),
! Log , Symol . i terator.
class Log {
con s t ructor ( ) {
this . me s sages [] ;

add (message ) {

207
t hi s . me s sages . push ( { mes sage : mes s a g e , timestamp : Date . now ( ) ));

[ S ymol . iterator ] ( ) {
return this . me s s a ge s . values ( ) ;

Log ,
.
const log = new L og ( ) ;
l g . dd ( " " ) ;
lg . dd ( " " ) ;
log . add ( " " ) ;
11. . .

/ / log, !
for ( le t entry of l o g ) {
console . log ( ' $ { entry . me s sage ) @ $ { entry . t imes t amp ) ' ) ;

,
mes s ages, .
class Log
// . . .

[ S ymol . iterat o r ] ( )
let i ;
=

const messages this . me s sage s ;


return {
next ( ) {
i f ( i >= mes s a ge s . lengt h )
return { value : unde fined, done : true } ;
return { value : message s [ i + + ] , done : false ) ;


: .
, .
:
. ,
. : -
. 1 1 :
1 + 1 2. 1 + 2 3. 2 + 3
5 .. .
1, 1 , 2, 3, 5 , 8 , 13, 21, 34, 55, 89, 144, . . .

208 n 1 2.
,
, ,
.
, t rue done:
c l a s s FibonacciSequence {
[ S ymol . iterato r ] ( ) {
let = , = 1 ;
return {
next ( )
let rval = { value : , done : false } ;
+= ;
= rva l . value ;
return rval ;

};

FibonacciSequence for . . . of,


. . . ,
! , break 10 .
const fib = new FibonacciSequence ( ) ;
l et i = ;
for ( let n o f f i b ) {
console . log ( n ) ;
i f ( ++ i > 9 ) brea k ;

(generator) - ,
.
, .
, . , ,
.
. -,
, . -,
.
.
(yield)
.
, .
. next .

209
JavaScript function;
.
, yield return.
,
.
funct ion* rainbow ( ) { // ,
yield ' ' ;
yield ' ' ;
yield ' ' ;
yield ' ' ;
yield ' ' ;
yield ' ' ;
yield ' ' ;

, . ,
. ,
.
=
const it rainbow ( ) ;
i t . next ( ) ; 1 1 va l u e : " ", don e : false }
i t . next ( ) ; 1 1 va lue : " ", don e : false
i t . next ( ) ; 1 1 va lue : " " , don e : fa lse }
i t . next ( ) ; 1 1 val ue : " " , don e : fa lse
i t . next ( ) ; 1 1 va lue : " " , don e : fa lse }
i t . next ( ) ; 1 1 va lue : " " , don e : fa lse }
i t . next ( ) ; 1 1 va l ue : " ", don e : fa lse
i t . next ( ) ; 1 1 va l ue : undefined, done : true }

rainbow ,
for . . . of.
for ( let color o f rainbow ( ) )
console . log ( color) ;

yield
,
. yield.
, , yield
- . ( ),
next .
, .
function* interrogate ( ) {
const name = yield " ? " ;

210 12.
const color = yield " ? " ;
return ' $ { name } $ { co l o r } . ' ;

, ,
. next,
. yield,
.
next,
name , next.
, .
const it = interrogate ( ) ;
i t . next ( ) ; / / { va l u e : " ? " , don e : fa lse }
i t . next ( ' ' ) ; / / { va l u e : " ? " don e : fa l s e }
1

i t . nt ( ' ' ) ; / / { val u e : " . " , done : true }


. 12. 1 .
1. ; .

func t i on* interrogate ( ) { const i t int errogate ( ) ;


c on s t narne = yield ' ? ' ;
const color = yield ' ? ' ;
return ' $ { narne } $ ( color} . ' ;

2 . narne=unde f ined; ' ? ' ; .

func t i on* interrogate ( ) {


const narne = y i e l d ' ? ' ; i t . next ( ) ;
const color = yield ' ? ' ;
return ' $ ( narne } $ { color } . ' ;

. nm= ' " ; " ? ' ; .

func t i on* interrogate ( ) {


const narne = yield ' ? ' ;
const color = y i e l d ' ? ' ; i t . next ( ' ' ) ;
return ' $ { narne } $ ( color } . ' ;

4 . lr= ' ' ; ' . ' ;


.

func t i on* interrogate ( )


const narne = y i e l d ' ? ' ;
const color = y i e l d/' Kao ? ' ; 1111( 1
return ' $ ( narne } $ { co l or } . ' ; ---i- i t . t ( ' ) ;

. 12. 1 :

211
, ;
. ,
,
.

, ;
function * .

return
yield ,
. return
t rue done. , ,
.
funct ion* ( )
yield ' ' ;
yield ' ' ;
return ' ' ;

=
const it count ( ) ;
i t . next ( ) ; 1 1 { va l ue : ' , ' don e : fa lse }
,
i t . next ( ) ; 1 1 { va l ue : ' ' done : fa lse }
i t . next ( ) ; 11 va l u e : ' , , done : true }

, ,
value,
done - t rue. , for . . . of, ""
.
11 " " " " , " "
for ( le t 1 of ( ) )
console . log ( l ) ;

return
.
yield; return
.
return .

212 12.

,
.
, S,
.

:
, .
,
. 14 ,
.

213
1 3

JavaScript ,
:
( , , : ).
6,
, .
:
. ( ) -
.


(subroutie) -
.
.
,
, .

(procedure),
(routie), (subprogram), (macro)
(callae uit).
, JavaScript
(subroutie). (
). ,
.

,
.
, .
const year = new Date ( ) . ge tFul lYear ( ) ;
i f ( year % 4 ! == 0 ) console . log ( ' $ { ye a r } . ' )
e l s e i f ( year % 1 0 0 ! = 0 ) console . log ( ' $ { year } . ' )
e l s e i f ( year % 4 ! = ) consol e . l o g ( ' $ { year } . ' )
e l s e conso l e . log ( ' { $ year } ' ) ;

, 10 1 00 .
, ,
;
! ,
. JavaScript .
function printLeapYearStatus ( ) {
const year = new Date ( ) . getFullYear ( ) ;
i f ( year % 4 ! == ) console . log ( ' $ { year } . ' )
e l s e i f ( year % 1 0 0 ! = 0 ) console . log ( ' $ { ye a r } . ' )
e l s e i f ( year % 4 0 0 ! = 0 ) console . log ( ' $ { year } . ' )
e l s e console . log ( ' { $ year } . ' ) ;

1- () printLeap
YearStatus. .
, :
printLeapYearStatus. getLeapYearS tatus leapYearStatus,
leapYea r? , :
.
- , . - JavaScript,
, . - ( ).
, , ,
. ,
. , .
, calculateCurrentLeapYearStatusAn
dPrintToConsole,
. .

,
printLeapYea rStatus -
:
, .
, ,
, .

, .

21 13.
printLeapYearStatus , ,
, .
L- ,
.
,
, .
, ( !) ,
, .
funct ion i sCurrentYearLeapYear ( ) {
const year = new Date ( ) . ge t FullYear ( ) ;
i f ( year % 4 ! == 0 ) return false ;
e l s e i f ( year % 1 0 0 ! = 0 ) return true ;
e l s e i f ( year % 4 0 0 ! = 0 ) return false ;
e l s e return true ;

,
.
const days inMonth =
( 3 1 , isCurrentYearLeapYear ( ) ? 2 9 : 2 8 , 3 1 , 3 0 , 3 1 , 3 0 ,
31, 31, 30, 31, 30, 31] ;
i f ( i sCurrentYearLeapYea r ( ) ) console . log ( ' Ceac . ' ) ;

,
. ,
(
), is.
crrent (). ?
. , ,
3 1 2016 , 1 2017 .
-

. . .
,
, . . . .
, (relation)
. .
, ,
(pure function). (, Haskell)
.
, ?
,
. i sCurrentYearLeapYea r

, 21 7
, , ,
( t rue, -
false). -, (side effect).
, .
(
). .
const colors = [ ' ' , ' ' , ' ' , ' ' ,
' ' , ' ' , ' ' ] ;
let colorindex = - 1 ;
function getNextRa inbowColor ( ) {
i f ( ++colorindex >= colors . length) colorindex ;
return colors [ colorindex ] ;

getNextRainbowColor ,
. :
(
, - ),
( colorindex ) .
colorindex ; getNextRainbowColor
, .
.
? !
function i s LeapYear ( year ) {
i f ( year % 4 ! == 0 ) return fal s e ;
e l s e i f ( year % 1 0 0 ! = 0 ) return true ;
e l s e i f ( year % 4 0 0 ! = 0 ) return false ;
e l s e return true ;


, , .
getNextRainbowColor .
, .
const getNextRainbowColor = ( function ( ) {
const colors = [ ' ' , ' ' , ' ' , ' ' ,
' ' , ' ' , ' ' ] ;
let colorindex = - 1 ;
return func t i on ( ) {
i f ( ++colorindex >= colors . lengt h ) colorindex ;
return colors [ co lo r i nde x ] ;
};
}) () ;

218 13.
,
,
. ,
. ,
, , (
1 8).
set Interval ( function ( ) {
document . querySelector ( ' . rainbow ' )
. s tyle [ ' background-color ' ] = getNextRainbowColor ( ) ;
} 500) ;
1

, , , :
HTML rainbow .
, - getNextRainbowColor ( ) ,
! "
': ,
, .
funct ion getRainbowi terator ( ) {
const colors = [ ' ' , ' ' , ' ' , ' ' ,
' ' , ' ' , ' ' ] ;
let colorindex =-1;
return {
next ( ) !
i f ( ++colorindex > = colors . l engt h ) colorindex = ;
return { value : colors [ colorindex ] , done : false } ;

};

getRainbow i t e ra tor :
(), .
, .
const rainbowi terator = getRainbowiterator ( ) ;
s e t i n terva l ( funct ion ( ) {
document . querySelector ( ' . ra inbow ' )
. style [ ' background-co lor ' ]= rainbowit erator . next ( ) . va lue ;
} 500 ) ;
/

, :
next ( ) r , ,
next ( ) , . ,
, .
getRainbowlterator ,
, .

, 219
?
, , (
, q ),
" ?1 ?"
JavaScript,
, . ?
, :
.
- .


,
: DRY (don't repeat yourself - ). ,
, ( - ""), ,
, , -
. " ': -
, ,
.

-
"" .
: " !"
, : " ?"
: "
, ':
,
, . -
, ,
, , . ,
, 99% , 1 % .
, - :
, ,
.
, ,
. ""
.
.
, ,

1 "So What" Pink 2008 . - . .

220 13.
. ,
, .
- ,
9, ,
.


JavaScript Function.
, ;
. , ,
v, typeof v " function".
, , v :
" obj ect " . typeo f v
. , , , v , -

v instanceof Obj ect . ,


, typeof.




(IIFE) 6 , .
( 14) ,
IIFE .
IIFE
,
. ,
5 ( " ! " ).
setTimeout, (
) ( ). ,
" ! " 1 ,5 .
s e tTimeout ( funct ion ( ) { console . log ( " ! " ) ; } , 1500) ;

, , .
var i ;
for ( i=5 ; i >= O ; i - - ) {
setTimeout ( funct ion ( )
console . log ( i===O ? " ! " i) ;
}, ( 5-i ) * 1 0 0 0 ) ;

221
, var l et .
, IIFE . 5, 4 , 3, 2, 1 , " ! ",
-
. 1 .

, , setTimeout, ,
. , i, 5,
1 . , .
- ..

, i - 1 .
, ( let),
, , ,
. ,
( 14).

.
, i "
" ( ) .
.
function loopBody ( i) {
setTimeout ( function ( )
console . lo g ( i===O ? " ! " i) ;
} ' ( 5- i ) * 1 0 0 0 ) ;

var i ;
for ( i= S ; i > O ; i - - )
loopBody ( i ) ;

loopBody. , JavaScript
. ,
i, .
5, - 4 .. ,
(i): ,
(
loopBody).
,
, . IIFE:
, , ,
. IIFE.
var i ;
for ( i=S ; i > O ; i-- ) {
( function ( i ) {
setTimeout ( funct ion ( )
console . log ( i===O ? " ! " i) ;

222 1 3.
} , ( 5- i ) * 1 0 0 0 ) ;
} ) (i) ;

! , ,
: , ,
(. 1 3. 1 ) .

var i ;
for ( i=S ; i>O ; i-- ) {
( function ( i ) {
setTimeout ( function ( ) {
var i ; console . log ( i===O ? " ! " i) ;
for ( i=S ; i>O ; i-- ) { } , ( 5-i ) * l O O O ) ;
loopBody ( i ) ; }) (i) ;
} }

. 13. 1 .


, . -
.
for ( let i=5 ; i > O ; i - - ) (
setTimeout ( function ( )
console . log ( i===O ? " ! " i) ;
} , (5-i) * 1 00 0 ) ;

, let
for. for, ,
. , let JavaScript,
, i .
, , s e t T ime out, ,

.


, 2
: , ,
.

2 "Another Cup of Coffee" Mike And The Mechanics. - . .

223
, .
, -
(, , ).
,
,
, .
, (
). , , .
. . . , , .
, . ,
: 2 , 1 ..
, .
: ( - ).
( ),
, ,
: , ,
, ..
, , - .
, , ,
? , , .
, ,
.
(, , ).
(. 9).
.
.
,
.
? ,
, , "
?" ,
.
:
. ,
.
, .
- , ,
.

224 1 3.
function addThreeSquareAddFiveTakeSquareRoot ( x ) {
1 1 , ?
return Math . sqrt ( Math . pow ( x+ , 2 ) + 5 ) ;

/ /
const answer = ( addThreeSquareAddFiveTakeSquareRoot ( S ) +
addThreeSquareAddFiveTakeSquareRoot ( 2 ) ) /
addThreeSquareAddFiveTakeSqureRoot ( 7 ) ;

1 1
const f = addThreeSquareAddFiveT a ke SquareRoot ;
const answer = ( f ( S ) + f ( 2 ) ) / f ( 7 ) ;

, ""
addThree Squa reAddFi veTakeSquareRoot. ,
, f , addThreeSquareAd
dFiveTakeSquareRoot, . ,
(, f ( 5 ) ), ,
f , .
, ,
.
(namespacing), Node
(. 20), .
const Money = require ( ' math-money ' ) ; / / require - Node
/ /
const oneDollar Mone y . Dollar ( l ) ;
=

/ / , "Money . Dollar " :


const Dollar =Money . Do l l a r ;
c o n s t twoDollars = Dollar ( 2 ) ;
/ / : oneDollar twoDollars -

(aliasing) ,
Mone y . Dollar Dol lar, .
, ,
.


,
,
. - (pipeline),
, .
, .

225
? . ?
.
- .
, ""
. .
const s in = Math . si n ;
const c o s = Math . co s ;
const theta = Math . PI / 4 ;
const zoom = 2 ;
const offset = [ 1 , - 3 ] ;

const pipeline = [
function rotate ( p )
return {
: . * cos ( t heta ) - . * s i n ( theta ) ,
: . * sin ( t he t a ) + . * cos ( theta ) ,
};
},
functi on scale ( p ) {
return { : . * zoom, : . * zoom } ;
},
funct ion translat e ( p )
return { : . + offset [ O ] , : . + offset [ l ] ; } ;
},
];

/ / pipeline -
/ / , :

cons t = { : 1 , : 1 } ;
let 2 = ;
for ( l e t i=O ; i<pipe line . length; i + + ) {
2 = pipeline [ i ] ( 2 ) ;

/ / 2 - pl , 45 (pi/ 4 )
1 1 , 2 ,
/ / 1 3

, ,
.
: pipel ine [ i ]
i , .
( ). ,
. , -
.

226 1 .

: ,
. ,
, ,
.


:
setTirneout fo rEach.
,
.
( (callback))
. ,
. 1 4.
- ,
; ""
. sum,
( ,
, ).
, ,
'? , sumOfSquares " "
, '?
. sum.
function sum ( arr, f ) {
/ / , "
11 " ,
i f ( t ype o f f ! = ' funct ion ' ) f = => ;

return arr . reduce ( ( a , ) = > += f ( x ) , ) ;

sum ( [ 1 , 2 , 3 ] ) ; 1 1
sum ( [ l , 2 , 3 ] , => * ) ; / / 1 4
s um ( [ l , 2 , 3 ] , = > Math . pow ( x , 3 ) ) ; 1 1 3 6

sum . . . ,
. '? . ,
4,233'? . ,
sum, ..
. f
unde fined, , .
, , , " ':

227
. , 5,
5, ..
(,
), ,
"" .


, ,
, .
: , ( ),
, , , -.
, , ,
- , ,
.
, sum, ,
( !) , ,
. , ,
sumOfSqua res, ?
, ..
. ,
, . ( ,
, API,
sum, .)
,
.
function sumOfSquares ( arr) {
return sum ( arr, => * ) ;

, , , ,
, - ,
? ,
.
funct i on newSumme r ( f ) {
return arr => sum ( ar r , f ) ;

, newSumme r, sum,
, .
,
.

228 1 3.
const sumOfSquares = newSumme r ( x => * ) ;
const sumOfCube s = newSummer ( x = > Math . pow ( x , 3 ) ) ;
sumOfSquares ( [ 1 , 2 , 3 ] ) ; / / 1 4
sumOfCube s ( [ l , 2 , 3 ] ) ; / / 3 6

,
,
(currying) ,
( Haskell Curry).

.
,
Express ( - JavaScript).

-
(recursion), .
,
.
: .
, ,
.
1. , . 3.
2. . . 1 .
3 . !
, ;
. , .
function findNeedle ( haystack) {
i f ( haystac k . length === 0 ) return " ! " ;
i f ( ha ystac k . shift ( ) === ' ' ) return " ! "
r e turn findNeedle ( ha ystack ) ; / /

findNeedle ( [ ' ' , ' ' , ' ' , ' ' , ' ' , ' ' , ' ' ] ) ;

,
: haystack ( ), -
(!) ( -
, ; ,
Array . prototype . shi ft ).

229
,
(stopping condition) ; ,
JavaScript , (
). findNeedle
: .
,
.
, :
. - ,
. 4!
4 3 2 1 24. .
=

function fact ( n ) {
i f ( n === 1 ) return 1 ;
return n * fact ( n - 1 ) ;

(n === 1), , ,
n . 1 (
,
, , , , ).



, ML, Haskell, Clojure F#,
. , , r,

(, , , , ).
,
, " ?" ,
. :
. : ?
,
. ,
, , -
.

230 1 .
1 4

1 ,
. , ,
, : ,
, , . -
:
JavaScript .
JavaScript (single-threaded).
, JavaScript - .
(
, ),
, ,
, - , -
, (
(preemptive multitasking)).
, , ,
.
, JavaScript
,
, .
: ,
,
. ,
, .
JavaScript
. JavaScript (
)
. , JavaScript
: ,
. ,
, , , , .
- .
:
( MDN ),
.
, (
, ).
,
.
(, Ajax).
(, ..).
(,
).

r
,
, - ,
. ,
(
, ).
: , ,
. ,
; . ,
, .
: , , ,
.
,
, .


(callback) - JavaScript,

. - ,
.
: JavaScript. ,

(, , ).
(, ) .

232 14.

setTimeout,
.
cons o l e . log ( " :"+ new Date ( ) ) ;
function f ( ) {
console . log ( "oce : " + new Date ( ) ) ;

set Timeout ( f , 6 0 * 1 0 0 0 ) ; / /
console . log ( " o setTimeout ! " ) ;
console . log ( " ! " ) ;

(
), .
: Sun Aug 02 2 0 1 5 1 7 : 1 1 : 32 GMT- 0 7 0 0 ( Pa c i f i c Daylight Time )
setTimeout !
!
: Sun Aug 02 2 0 1 5 1 7 : 1 2 : 32 GMT - 0 7 0 0 ( Pa c i f i c Daylight T ime )

'l
, , .
( ), ,
. , .
: Sun Aug 0 2 2 0 1 5 1 7 : 1 1 : 32 GMT- 0 7 0 0 ( Pa c i f i c Daylight Time )
: Sun Aug 0 2 2 0 1 5 1 7 : 1 2 : 3 2 GMT- 0 7 0 0 ( Pa c i f i c Daylight Time )
setTimeout !
!

. . . !
, .
JavaScript ,
60 , ,
, . ""
: ,
.. , .
.

setTimeout.
, .
setTimeout ( funct ion ( ) {
console . log ( "oce : " + new Date ( ) ) ;
} , 60*1000 ) ;

setTimeout ,
.

233
, , , -
, . ,
setT imeout (
set interval ) . ,
!

setinterval clearinterval
setTimeout,
, set interval,

clea r i nte rva l. , 5
, 1 0 , .
const start = new Date ( ) ;
let i=O ;
const interva l i d = s e t i nt erval ( function ( )
l e t now = new Date ( ) ;
i f ( now . getMinutes ( ) ! == start . getMinut e s ( ) 1 1 ++i> l O )
return clearint e rva l ( interval i d ) ;
console . log ( ' $ { i } : $ { now } ' ) ;
} 5*1000 ) ;
'

, setinterval ,
.
c l ea rTimeout,
.

s e t T ime out, s et in t e rval c l e a r inte rva l


(window global Node).


( )
, -
. , ,
: , ( ),
, - .
,
, . countdown.
- 5- .
funct ion countdown ( } {
let i ; / / , l e t for

234 1 4.
nsl . lg ( " : " ) ;
for ( i=5 ; i>=O ; i - - ) {
setTimeout ( function ( )
console . log ( i===O ? " ! " i) ;
} , (5-i) *lOOO) ;

countdown ( ) ;

. , , ,
- . , 5 .
- 1 " ! " .
, var; let,
for, : for
, i 1 ,
-

. , , , i -1.
,
. countdown,
, i. () ,
for, i.
, for i,
. ( ( 5- i ) * 1 ),
: , 1 000, 2 0 0 0
- - -

.. , .
s etTimeout . ,
. -
, setTimeout, .
, ,
(IIFE), , i
for.
function countdown ( ) {
nsl . lg ( " : " ) ;
for ( le t i=5 ; i >= O ; i - - ) { / / i
setTimeout ( funct ion ( )
console . log ( i===O ? " ! " : i ) ;
} ' (5-i) *1000) ;

countdown ( ) ;

, ,
:
( ). -
,

235
. ,
.


Node

(error-first callback). , ,
, ,
.

. nul l unde fined, .
,
, , , -
.
Node, ,
.
const fs = require ( ' fs ' ) ;

const fname = ' may_or_may_not_exi s t . txt ' ;


f s . readFile ( fname , function ( er r , d a t a ) {
i f { err) return console . error ( ' Oa $ { fname } : $ { err . me s
sage } ' ) ;
console . log ( ' $ { fname } : $ { da t a } ' ) ;
});

, , -
e r r . , , ,
, (
cons o l e . error ,
, ).
,
, , , , ,
, , .
,
, ,
. ,
, ,
.
.
- -
Node ( ),

236 14.
, -
, .


,
: ,
.
, Node,
, 60 ,
.
const fs = require ( ' fs ' ) ;

fs . readFile ( ' a . txt ' , function ( er r , dataA) {


i f ( err) console . error ( err ) ;
fs . readFile ( ' b . txt ' , funct ion ( err , dataB)
i f ( er r ) cons o l e . error ( err) ;
f s . readFile ( ' c . txt ' , funct ion ( er r , dataC )
i f ( err) console . error ( err) ;
setTimeout ( function ( ) {
fs . writeFile ( ' d . txt ' , dataA+dataB+dataC, function ( er r ) {
i f ( err) console . error ( err ) ;
});
} , 60*1000 ) ;
});
});
});

m (callback hell).
, .
. , , -

, ,
. .
const fs = require ( ' fs ' ) ;
funct i on readSket chyFil e ( ) {
try {
fs . readFil e ( ' does_not_exist . txt ' , function ( er r , data ) {
i f ( err) throw e r r ;
});
catch ( er r ) {
nsl . lg ( ' : ,
m ' ) ;

readS ketchyFi le ( ) ;
,
, .
. . ,
, -
. , try . . . catch
. t ry . . . catch readSketchyFi le,
, fs . readFi le
.
, ,
( !).
, ,
.
,

. .

1 (promise)
. ( ),
" " .
;
.
,
,
, ,
.
:
, P rorni s e.
: (fulfilled)
( ) (rejected) ( ).
, (
, ) .

1 MDN promise .
, , - !
, , JavaScript
, .
!
, .
.
promise. MDN
. - . .

238 1 4.
, ;
, .
, , (settled).

, , - ,
. ,
, - ,
(
- , ,
, ).


:
Promi s e ,
resolve () rej ec t () ( ,
!). countdown,
( 5-
) , ,
.
function countdown ( seconds )
return new Promise ( function ( resol ve , rej e c t ) {
for ( let i=seconds ; i>= O ; i - - )
setTimeout ( function ( ) {
i f ( i> O ) console . log ( i + ' . . );
. '

e l s e re solve ( consol e . log ( " Cap ! " ) ) ;


} ( seconds- i ) * 1 0 0 0 ) ;
,

});

. ,
, , - .
,
-, DOM
. ...
. , resol ve ( rej ect) .
"-! resolve ...
': resol ve
re j ect ...
. , ,

n 239
- (
).


, countdown.
: countdown ( 5) .

.
? .
countdown ( 5 ) . then (
function ( ) {
nsl . lg ( " " ) ;
},
function ( err) {
consol e . log ( " Oa : " + err . me s s a ge ) ;

);


; ( then) .
:
(.. ), -
(.. ).
. catch.
, (
, ).
cons t = countdown ( 5 ) ;
p . then ( function ( ) {
nsl . lg ( " " ) ;
});
p . catch ( functi on ( e rr ) {
consol e . log ( " Oa : " + err . me s sage ) ;
});

countdown ,
. , ,
1 3 .
funct ion countdown ( se conds ) {
return new Promi s e ( funct ion ( re s olve , rej ect ) {
for ( le t i=seconds ; i>=O ; i - - ) {
s e t T imeout ( function ( ) {
i f ( i=== l ) return r e j ect ( new rrr ( "
! " ) ) ;

240 1 4.
}) ;

.
. ,
, 1 3, . 13
, 1 3. ...
! rej ect ( resol ve) ;
.
, countdown .
,
( ), . ,
. .

, , , ( !)
.
, , . ,
" 50%': 2
, ,
JavaScript,
, .

(event) - ,
JavaScript. : ()
, , ( "") ,
. ?
, ! , Node
. , jQuery
. countdown,
EventEmitter Node. EventEmit t e r
, countdown, .
, countdown Countdown.
const EventEmit t e r = require ( ' events ' ) . EventEmi t t e r ;

class Countdown extends EventEmit ter {


con s t ructor ( s econd s , superst i t i ous )

2 , Q.

241
super ( ) ;
t hi s . se conds = s econds ;
t hi s . super s t i t ious = ! ! super s t i t i ou s ;

go ( ) {
const countdown = t hi s ;
return new Promi s e ( funct ion ( res olve , r e j ect ) {
for ( le t i=countdown . seconds ; i>= O ; i-- ) {
setTimeout ( function ( ) {
i f ( countdown . super s t i t ious & & i=== 1 3 )
return rej ect ( new rrr ( " ! " ) ) ;
countdown . emit ( ' ti ck ' , i ) ;
i f ( i=== O ) resolve ( ) ;
} , ( countdown . se conds - i ) * 1 0 0 0 ) ;

});

Count down EventEmitter,


. go - ,
. , ,
go, - this countdown. ,
this
, . ,
this - ,
. , thi s,
.
countdown . emi t ( ' t i ck ' , i ) . ,
t i c k (
; , "tick" ), . ,
, .
const = new Countdown ( S ) ;

c . on ( ' tick ' , function ( i ) {


i f ( i > O ) console . log ( i + ' . . . );
'

});

c . go ( )
. then ( funct ion ( )
console . log ( ' Cap ! ' ) ;
})
. catch ( funct ion ( err) {
consol e . error ( er r . mes sage ) ;
})

242 1 4.
on EventEmi tter
. ti ck.
t i c k , . go,
. ,
" ! " . , " ! "
t ick, .
, , ,
countdown, .

, .
-
Countdown, 1 3,
.
const = new Countdown ( l 5 , t rue )

. on ( ' tick ' , function ( i ) { / / , " " ' '


i f ( i > O ) console . log ( i + ' . . . ) ;
'

});

. go ( )
. then ( funct ion ( )
console . log ( ' ! ' ) ;
})
. catch ( function ( er r ) {
console . error ( err . me s sage ) ;
})

t i c k
( ).
, . ,
"" ,
1 3 ,
! , ,
,
.
const EventEmit t e r = require ( ' events ' ) . EventEmitte r ;

class Countdown extends EventEmit t e r {


constructor ( seconds , supers t i t ious )
supe r ( ) ;
thi s . s econds =seconds ;
thi s . supe r s t i t ious 1 ! supe r s t i t ious ;
=

go ( ) {

243
const countdown = t hi s ;
const timeout ids = [ ] ;
return new Promi s e ( funct ion ( re solve , rej ect ) {
for ( le t i=countdown . seconds ; i >= O ; i - - ) {
t imeout ids . push ( setTimeout ( function ( ) {
i f ( countdown . supe r s t i t ious && i=== l )
/ /
t imeout ids . forEach ( clearTimeout ) ;
return rej ect ( new rrr ( "
! " ) ) ;

countdown . emit ( ' t ick ' , i ) ;


i f ( i=== O ) resolve ( ) ;
}, ( countdown . seconds - i ) * 1 0 0 0 ) ) ;

});


, z (chained),
.. ,
, ". ..
launch, .
funct ion launch ( ) {
return new Promi s e ( funct i on ( re s o lve , rej ect ) {
console . log ( " oexa ! " ) ;
setTimeout ( function ( ) {
resolve ( "Ha ! " ) ;
} , 2*1000) ; / /
});

.
const = new Countdown ( 5 )
. on ( ' t ick ' , i => console . log ( i + ' . . . ) ) ; '

c . go ( )
. then ( launch )
. then ( functi on ( ms g )
console . log (msg ) ;
})
. catch ( funct ion ( err) {
console . error ( " Xco, . . . . " ) ;
})

244 1 4.
,
; - ,
catch.
1 5- ; ,
launch .



, ,
, ( ..
resol ve rej ect).
, . . .
.

;
, . , ,
" ''. ,
10 , 1 - .
launch . ,
, .
function launch { ) {
return new Promi s e { funct ion ( resolve, rej e c t ) {
i f { Math . random { ) < 0 . 5 ) return ; / /
console . l og { " oexa ! " ) ;
setTimeout { funct ion { ) {
resolve { "Ha ! " ) ;
} , 2* 1 0 00 ) ; / /
});

:
rej ect .
. , ,
, ". , .
, .
function addTimeout { fn , t imeout ) {
i f { t imeout=== unde fined) t imeout = 1 0 0 0 ; / /
return functi on { . . . args ) {
return new Promi s e { funct ion ( re solve , r e j e c t ) {
const t i d setTimeout { re j e c t , t imeout ,
=

new rrr { " " ) ) ;


fn { . . . arg s )

245
"." , ,
, ,
... !': :

. -
"" . :
, .
, 1 (
?). ,
1 1 .
. go ( )
. then ( addTimeout ( launch, 4 * 1 0 0 0 ) )
. then ( function (msg) {
cons o l e . log (msg) ;
})
. ca t ch ( funct ion ( er r )
(
console . error ( "Xco, : " + err . me s sage ) ;
});

,
launch .

1 2,
.
, , ,
JavaScript.
: ,
. ,
: 1, 2, 3 ..
, .

246 1 4.

?
.
" ":
,
.
.
dataA ' a . txt '
dataB = ' b . txt '
dataC = ' c . txt '
6 0
dataA + dataB + dataC ' d . txt '

, ...
:
.
, , -
Node .
nfcall (Node function call - Node).
function nfcall ( f , . . . args ) {
return new Promise ( funct ion ( re s o lve , rej ect ) {
f . cal l ( nu l l , . . . args , function ( err, . . . args )
i f ( er r ) return rej ect ( err) ;
resolve ( args . length<2 ? args [ O ] : args ) ;
});
}) ;

nfca l l
Q ( ).
,
Q. , -
, .
nfca l l , "
" .

, Node, ,
.
s etT ime out, ...
Node,
. ptimeout (promise
timeout - ).

247
function pt imeout (delay) {
return new Promi s e ( function ( re solve , rej ect ) {
s e tTimeout { resolve , del a y ) ;
}) ;

, , - (generator runner).
, .
,
, ,
. g run (generator run -
).
function grun ( g ) {
const i t = g ( ) ;
( function i terate ( va l )
const = i t . next ( va l ) ;
if ( ! . done ) {
i f ( x . va lue instanceof Promi s e ) {
x . va lue . then ( i t e rate ) . ca t ch ( err => i t . throw ( err ) ) ;
else {
setTimeout ( iterate , , x . value ) ;

} ) () ;

g run runGenerator,
(Kyle Simpson)
.
.

.
, . 6, ,
yie ld, , next
. .
,
. , ,
. "
setT irneout i te rate?" ,
(
JavaScript ).
" !" " ?"
. nfcall (

248 1 4.
Node)
(), grun
( ES7 awai t, , ,
grun ). ,
, , .
" " ?
.
funct i on * theFuturei sNow ( )