You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: chapters/chapter0.md
+2-2
Original file line number
Diff line number
Diff line change
@@ -78,7 +78,7 @@
78
78
79
79
Вот та же программа на JavaScript:
80
80
81
-
```
81
+
```js
82
82
var total =0, count =1;
83
83
while (count <=10) {
84
84
total += count;
@@ -94,7 +94,7 @@ console.log(total);
94
94
95
95
И наконец, вот так могла бы выглядеть программа, если б у нас были удобные операции range и sum, которые, соответственно, создавали бы набор номеров в заданном промежутке и подсчитывали сумму набора:
Copy file name to clipboardexpand all lines: chapters/chapter1.md
+24-24
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@
10
10
11
11
К примеру, номер 13. Вместо десятичной системы, состоящей из 10 цифр, у вас есть двоичная система с двумя цифрами. Значение каждой позиции числа удваивается при движении справа налево. Биты, составляющие число 13, вместе с их весами:
12
12
13
-
```
13
+
```js
14
14
00001101
15
15
1286432168421
16
16
```
@@ -31,7 +31,7 @@
31
31
##Числа
32
32
Величины числовых типов, это – сюрприз – числа. В программе JavaScript они записываются как
33
33
34
-
```
34
+
```js
35
35
13
36
36
```
37
37
@@ -45,13 +45,13 @@ JavaScript использует фиксированное число бит (64
45
45
46
46
Дроби записываются с помощью точки.
47
47
48
-
```
48
+
```js
49
49
9.81
50
50
```
51
51
52
52
Очень большие или маленькие числа записываются научной записью с буквой “e” (exponent), за которой следует степень:
53
53
54
-
```
54
+
```js
55
55
2.998e8
56
56
```
57
57
@@ -62,23 +62,23 @@ JavaScript использует фиксированное число бит (64
62
62
##Арифметика
63
63
Главное, что можно делать с числами – это арифметические вычисления. Сложения и умножения используют два числа и выдают третье. Как это записывается в JavaScript:
64
64
65
-
```
65
+
```js
66
66
100+4*11
67
67
```
68
68
69
69
Символы + и * называются операторами. Первый – сложение, второй – умножение. Помещаем оператор между двумя величинами и получаем значение выражения.
70
70
71
71
А в примере получается «сложить 4 и 100 и затем умножить результат на 11», или умножение выполняется сначала? Как вы могли догадаться, умножение выполняется первым. Но как и в математике, это можно изменить при помощи скобок:
72
72
73
-
```
73
+
```js
74
74
(100+4) *11
75
75
```
76
76
77
77
Для вычитания используется оператор -, а для деления - /
78
78
79
79
Когда операторы используются без скобок, порядок их выполнения определяется их приоритетом. У операторов * и / приоритет одинаковый, выше, чем у + и -, которые между собой равны по приоритету. При вычислении операторов с равным приоритетом они вычисляются слева направо:
80
80
81
-
```
81
+
```js
82
82
1-2+1
83
83
```
84
84
@@ -98,7 +98,7 @@ JavaScript использует фиксированное число бит (64
98
98
##Строки
99
99
Следующий базовый тип данных – строки. Они используются для хранения текста. Записываются они в кавычках:
100
100
101
-
```
101
+
```js
102
102
"Что посеешь, то из пруда"
103
103
'Баба с возу, потехе час'
104
104
```
@@ -109,20 +109,20 @@ JavaScript использует фиксированное число бит (64
109
109
110
110
Строка “Между первой и второй\nсимвол будет небольшой” на самом деле будет выглядеть так:
111
111
112
-
```
112
+
```js
113
113
Между первой и второй
114
114
символ будет небольшой
115
115
```
116
116
117
117
Если вам нужно включить в строку обратный слеш, его тоже нужно экранировать: \\\\. Инструкцию “Символ новой строки — это “\n”” нужно будет написать так:
118
118
119
-
```
119
+
```js
120
120
"Символ новой строки – это \"\\n\""
121
121
```
122
122
123
123
Строки нельзя делить, умножать и складывать. Однако с ними можно использовать оператор +, который будет соединять их друг с другом. Следующее выражение выдаст слово «соединение»:
124
124
125
-
```
125
+
```js
126
126
"сое"+"ди"+"н"+"ение"
127
127
```
128
128
@@ -131,7 +131,7 @@ JavaScript использует фиксированное число бит (64
131
131
##Унарные операторы
132
132
Не все операторы записываются символами – некоторые словами. Один из таких операторов – `typeof`, который выдаёт название типа величины, к которой он применяется.
133
133
134
-
```
134
+
```js
135
135
console.log(typeof4.5)
136
136
// → number
137
137
@@ -143,7 +143,7 @@ console.log(typeof "x")
143
143
144
144
Предыдущие операторы работали с двумя величинами, однако typeof использует только одну. Операторы, работающие с двумя величинами, называются бинарными, а с одной – унарными. Минус (вычитание) можно использовать и как унарный, и как бинарный.
Другие сходные операторы – это >= (больше или равно), <= (меньше или равно), == (равно), != (не равно).
176
176
177
-
```
177
+
```js
178
178
console.log("Хочется"!="Колется")
179
179
// → true
180
180
```
181
181
182
182
В JavaScript есть только одна величина, которая не равна самой себе – `NaN` («не число»).
183
183
184
-
```
184
+
```js
185
185
console.log(NaN==NaN)
186
186
// → false
187
187
```
@@ -192,7 +192,7 @@ NaN – это результат любого бессмысленного вы
192
192
193
193
Оператор && — логическое «и». Он бинарный, и его результат – правда, только если обе величины, к которым он применяется, тоже правда.
194
194
195
-
```
195
+
```js
196
196
console.log(true&&false)
197
197
// → false
198
198
console.log(true&&true)
@@ -201,7 +201,7 @@ console.log(true && true)
201
201
202
202
Оператор || — логическое «или». Выдаёт true, если одна из величин true.
203
203
204
-
```
204
+
```js
205
205
console.log(false||true)
206
206
// → true
207
207
console.log(false||false)
@@ -212,13 +212,13 @@ console.log(false || false)
212
212
213
213
При использовании логических и арифметических операторов не всегда ясно, когда нужны скобки. На практике вы можете справиться с этим, зная, что у || приоритет ниже всех, потом идёт &&, потом операторы сравнения, потом все остальные. Такой порядок был выбран для того, чтобы в выражениях типа следующего можно было использовать минимальное количество скобок:
214
214
215
-
```
215
+
```js
216
216
1+1==2&&10*10>50
217
217
```
218
218
219
219
Последний логический оператор не унарный и не бинарный – он тройной. Записывается при помощи вопросительного знака и двоеточия:
220
220
221
-
```
221
+
```js
222
222
console.log(true?1:2);
223
223
// → 1
224
224
console.log(false?1:2);
@@ -235,7 +235,7 @@ console.log(false ? 1 : 2);
235
235
##Автоматическое преобразование типов
236
236
Ранее я упоминал, что JavaScript позволяет выполнять любые, подчас очень странные программы. К примеру:
237
237
238
-
```
238
+
```js
239
239
console.log(8*null)
240
240
// → 0
241
241
console.log("5"-1)
@@ -254,7 +254,7 @@ console.log(false == 0)
254
254
255
255
При сравнении величин одного типа через ==, легко предсказать, что вы должны получить true, если они одинаковые (исключая случай с NaN). Но когда типы различаются, JavaScript использует сложный и запутанный набор правил для сравнений. Обычно он пытается преобразовать тип одной из величин в тип другой. Когда с одной из сторон оператора возникает null или undefined, он выдаёт true, если обе стороны имеют значение null или undefined.
256
256
257
-
```
257
+
```js
258
258
console.log(null==undefined);
259
259
// → true
260
260
console.log(null==0);
@@ -272,7 +272,7 @@ console.log(null == 0);
272
272
273
273
К примеру, || вернёт значение с левой части, когда его можно преобразовать в true – а иначе вернёт правую часть.
Copy file name to clipboardexpand all lines: chapters/chapter10.md
+16-16
Original file line number
Diff line number
Diff line change
@@ -49,7 +49,7 @@
49
49
50
50
Обратите внимание на простейший модуль, связывающий имена с номерами дней недели – как делает метод getDay объекта Date.
51
51
52
-
```
52
+
```js
53
53
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
54
54
functiondayName(number) {
55
55
return names[number];
@@ -63,7 +63,7 @@ console.log(dayName(1));
63
63
64
64
Можно сделать так:
65
65
66
-
```
66
+
```js
67
67
vardayName=function() {
68
68
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
69
69
returnfunction(number) {
@@ -79,7 +79,7 @@ console.log(dayName(3));
79
79
80
80
Подобный шаблон можно использовать для изолирования кода. Следующий модуль пишет в консоль значение, но не предоставляет никаких значений для использования другими модулями.
81
81
82
-
```
82
+
```js
83
83
(function() {
84
84
functionsquare(x) { return x * x; }
85
85
var hundred =100;
@@ -97,7 +97,7 @@ console.log(dayName(3));
97
97
98
98
Представьте, что нам надо добавить ещё одну функцию в наш модуль «день недели». Мы уже не можем возвращать функцию, а должны завернуть две функции в объект.
99
99
100
-
```
100
+
```js
101
101
varweekDay=function() {
102
102
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
Когда модуль большой, собирать все возвращаемые значения в объект в конце функции неудобно, потому что многие возвращаемые функции будут большими, и вам было бы удобнее их записывать где-то в другом месте, рядом со связанным с ними кодом. Удобно объявить объект (обычно называемый exports) и добавлять к нему свойства каждый раз, когда нам надо что-то экспортировать. В следующем примере функция модуля принимает объект интерфейса как аргумент, позволяя коду снаружи функции создать его и сохранить в переменной. Снаружи функции this ссылается на объект глобальной области видимости.
114
114
115
-
```
115
+
```js
116
116
(function(exports) {
117
117
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
Самый очевидный – оператор eval, который выполняет строку кода в текущем окружении. Это плохая идея – он нарушает некоторые свойства окружения, которые обычно у него есть, например изоляция от внешнего мира.
144
144
145
-
```
145
+
```js
146
146
functionevalAndReturnX(code) {
147
147
eval(code);
148
148
return x;
@@ -154,7 +154,7 @@ console.log(evalAndReturnX("var x = 2"));
154
154
155
155
Способ лучше – использовать конструктор Function. Он принимает два аргумента – строку, содержащую список имён аргументов через запятую, и строку, содержащую тело функции.
Так как конструктор new Function оборачивает код модуля в функцию, нам не надо писать функцию, оборачивающую пространство имён, внутри самого модуля. А так как exports является аргументом функции модуля, модулю не нужно его объявлять. Это убирает много мусора из нашего модуля-примера.
181
181
182
-
```
182
+
```js
183
183
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
Традиционное решение – предоставить модули с другой переменной, module, которая является объектом со свойством exports. Оно изначально указывает на пустой объект, созданный require, но может быть перезаписано другим значением, чтобы экспортировать что-либо ещё.
Загруженные таким образом модули должны содержать вызовы define. В качестве их интерфейса используется то, что было возвращено функцией, переданной в define. Вот модуль weekDay:
247
247
248
-
```
248
+
```js
249
249
define([], function() {
250
250
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
251
251
return {
@@ -261,7 +261,7 @@ define([], function() {
261
261
262
262
Функция getModule принимает имя и возвращает такой объект, и убеждается в том, что модуль поставлен в очередь загрузки. Она использует кеширующий объект, чтобы не грузить один модуль дважды.
263
263
264
-
```
264
+
```js
265
265
var defineCache =Object.create(null);
266
266
var currentMod =null;
267
267
@@ -285,7 +285,7 @@ function getModule(name) {
285
285
286
286
Функция define сама использует getModule для загрузки или создания объектов модулей для зависимостей текущего модуля. Её задача – запланировать запуск функции moduleFunction (содержащей сам код модуля) после загрузки зависимостей. Для этого она определяет функцию whenDepsLoaded, добавляемую в массив onLoad, содержащий все пока ещё не загруженные зависимости. Эта функция сразу прекращает работу, если есть ещё незагруженные зависимости, так что она выполнит свою работу только раз, когда последняя зависимость загрузится. Она также вызывается сразу из самого define, в случае когда никакие зависимости не нужно грузить.
287
287
288
-
```
288
+
```js
289
289
functiondefine(depNames, moduleFunction) {
290
290
var myMod = currentMod;
291
291
var deps =depNames.map(getModule);
@@ -352,7 +352,7 @@ function define(depNames, moduleFunction) {
352
352
###Названия месяцев
353
353
Напишите простой модуль типа weekday, преобразующий номера месяцев (начиная с нуля) в названия и обратно. Выделите ему собственное пространство имён, т.к. ему потребуется внутренний массив с названиями месяцев, и используйте чистый JavaScript, без системы загрузки модулей.
0 commit comments