Skip to content

Commit 9138a06

Browse files
committed
attempt to return to highlights
1 parent 152445f commit 9138a06

22 files changed

+562
-562
lines changed

chapters/chapter0.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878

7979
Вот та же программа на JavaScript:
8080

81-
```
81+
```js
8282
var total = 0, count = 1;
8383
while (count <= 10) {
8484
total += count;
@@ -94,7 +94,7 @@ console.log(total);
9494

9595
И наконец, вот так могла бы выглядеть программа, если б у нас были удобные операции range и sum, которые, соответственно, создавали бы набор номеров в заданном промежутке и подсчитывали сумму набора:
9696

97-
```
97+
```js
9898
console.log(sum(range(1, 10)));
9999
// → 55
100100
```

chapters/chapter1.md

+24-24
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
К примеру, номер 13. Вместо десятичной системы, состоящей из 10 цифр, у вас есть двоичная система с двумя цифрами. Значение каждой позиции числа удваивается при движении справа налево. Биты, составляющие число 13, вместе с их весами:
1212

13-
```
13+
```js
1414
0 0 0 0 1 1 0 1
1515
128 64 32 16 8 4 2 1
1616
```
@@ -31,7 +31,7 @@
3131
##Числа
3232
Величины числовых типов, это – сюрприз – числа. В программе JavaScript они записываются как
3333

34-
```
34+
```js
3535
13
3636
```
3737

@@ -45,13 +45,13 @@ JavaScript использует фиксированное число бит (64
4545

4646
Дроби записываются с помощью точки.
4747

48-
```
48+
```js
4949
9.81
5050
```
5151

5252
Очень большие или маленькие числа записываются научной записью с буквой “e” (exponent), за которой следует степень:
5353

54-
```
54+
```js
5555
2.998e8
5656
```
5757

@@ -62,23 +62,23 @@ JavaScript использует фиксированное число бит (64
6262
##Арифметика
6363
Главное, что можно делать с числами – это арифметические вычисления. Сложения и умножения используют два числа и выдают третье. Как это записывается в JavaScript:
6464

65-
```
65+
```js
6666
100 + 4 * 11
6767
```
6868

6969
Символы + и * называются операторами. Первый – сложение, второй – умножение. Помещаем оператор между двумя величинами и получаем значение выражения.
7070

7171
А в примере получается «сложить 4 и 100 и затем умножить результат на 11», или умножение выполняется сначала? Как вы могли догадаться, умножение выполняется первым. Но как и в математике, это можно изменить при помощи скобок:
7272

73-
```
73+
```js
7474
(100 + 4) * 11
7575
```
7676

7777
Для вычитания используется оператор -, а для деления - /
7878

7979
Когда операторы используются без скобок, порядок их выполнения определяется их приоритетом. У операторов * и / приоритет одинаковый, выше, чем у + и -, которые между собой равны по приоритету. При вычислении операторов с равным приоритетом они вычисляются слева направо:
8080

81-
```
81+
```js
8282
1 - 2 + 1
8383
```
8484

@@ -98,7 +98,7 @@ JavaScript использует фиксированное число бит (64
9898
##Строки
9999
Следующий базовый тип данных – строки. Они используются для хранения текста. Записываются они в кавычках:
100100

101-
```
101+
```js
102102
"Что посеешь, то из пруда"
103103
'Баба с возу, потехе час'
104104
```
@@ -109,20 +109,20 @@ JavaScript использует фиксированное число бит (64
109109

110110
Строка “Между первой и второй\nсимвол будет небольшой” на самом деле будет выглядеть так:
111111

112-
```
112+
```js
113113
Между первой и второй
114114
символ будет небольшой
115115
```
116116

117117
Если вам нужно включить в строку обратный слеш, его тоже нужно экранировать: \\\\. Инструкцию “Символ новой строки — это “\n”” нужно будет написать так:
118118

119-
```
119+
```js
120120
"Символ новой строки – это \"\\n\""
121121
```
122122

123123
Строки нельзя делить, умножать и складывать. Однако с ними можно использовать оператор +, который будет соединять их друг с другом. Следующее выражение выдаст слово «соединение»:
124124

125-
```
125+
```js
126126
"сое" + "ди" + "н" + "ение"
127127
```
128128

@@ -131,7 +131,7 @@ JavaScript использует фиксированное число бит (64
131131
##Унарные операторы
132132
Не все операторы записываются символами – некоторые словами. Один из таких операторов – `typeof`, который выдаёт название типа величины, к которой он применяется.
133133

134-
```
134+
```js
135135
console.log(typeof 4.5)
136136
// → number
137137

@@ -143,7 +143,7 @@ console.log(typeof "x")
143143

144144
Предыдущие операторы работали с двумя величинами, однако typeof использует только одну. Операторы, работающие с двумя величинами, называются бинарными, а с одной – унарными. Минус (вычитание) можно использовать и как унарный, и как бинарный.
145145

146-
```
146+
```js
147147
console.log(- (10 - 2))
148148
// → -8
149149
```
@@ -154,7 +154,7 @@ console.log(- (10 - 2))
154154
##Сравнения
155155
Один из способов получить булевские величины:
156156

157-
```
157+
```js
158158
console.log(3 > 2)
159159
// → true
160160
console.log(3 < 2)
@@ -165,7 +165,7 @@ console.log(3 < 2)
165165

166166
Строки можно сравнивать так же:
167167

168-
```
168+
```js
169169
console.log("Арбуз" < "Яблоко")
170170
// → true
171171
```
@@ -174,14 +174,14 @@ console.log("Арбуз" < "Яблоко")
174174

175175
Другие сходные операторы – это >= (больше или равно), <= (меньше или равно), == (равно), != (не равно).
176176

177-
```
177+
```js
178178
console.log("Хочется" != "Колется")
179179
// → true
180180
```
181181

182182
В JavaScript есть только одна величина, которая не равна самой себе – `NaN` («не число»).
183183

184-
```
184+
```js
185185
console.log(NaN == NaN)
186186
// → false
187187
```
@@ -192,7 +192,7 @@ NaN – это результат любого бессмысленного вы
192192

193193
Оператор &amp;&amp; — логическое «и». Он бинарный, и его результат – правда, только если обе величины, к которым он применяется, тоже правда.
194194

195-
```
195+
```js
196196
console.log(true && false)
197197
// → false
198198
console.log(true && true)
@@ -201,7 +201,7 @@ console.log(true && true)
201201

202202
Оператор || — логическое «или». Выдаёт true, если одна из величин true.
203203

204-
```
204+
```js
205205
console.log(false || true)
206206
// → true
207207
console.log(false || false)
@@ -212,13 +212,13 @@ console.log(false || false)
212212

213213
При использовании логических и арифметических операторов не всегда ясно, когда нужны скобки. На практике вы можете справиться с этим, зная, что у || приоритет ниже всех, потом идёт &amp;&amp;, потом операторы сравнения, потом все остальные. Такой порядок был выбран для того, чтобы в выражениях типа следующего можно было использовать минимальное количество скобок:
214214

215-
```
215+
```js
216216
1 + 1 == 2 && 10 * 10 > 50
217217
```
218218

219219
Последний логический оператор не унарный и не бинарный – он тройной. Записывается при помощи вопросительного знака и двоеточия:
220220

221-
```
221+
```js
222222
console.log(true ? 1 : 2);
223223
// → 1
224224
console.log(false ? 1 : 2);
@@ -235,7 +235,7 @@ console.log(false ? 1 : 2);
235235
##Автоматическое преобразование типов
236236
Ранее я упоминал, что JavaScript позволяет выполнять любые, подчас очень странные программы. К примеру:
237237

238-
```
238+
```js
239239
console.log(8 * null)
240240
// → 0
241241
console.log("5" - 1)
@@ -254,7 +254,7 @@ console.log(false == 0)
254254

255255
При сравнении величин одного типа через ==, легко предсказать, что вы должны получить true, если они одинаковые (исключая случай с NaN). Но когда типы различаются, JavaScript использует сложный и запутанный набор правил для сравнений. Обычно он пытается преобразовать тип одной из величин в тип другой. Когда с одной из сторон оператора возникает null или undefined, он выдаёт true, если обе стороны имеют значение null или undefined.
256256

257-
```
257+
```js
258258
console.log(null == undefined);
259259
// → true
260260
console.log(null == 0);
@@ -272,7 +272,7 @@ console.log(null == 0);
272272

273273
К примеру, || вернёт значение с левой части, когда его можно преобразовать в true – а иначе вернёт правую часть.
274274

275-
```
275+
```js
276276
console.log(null || "user")
277277
// → user
278278
console.log("Karl" || "user")

chapters/chapter10.md

+16-16
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949

5050
Обратите внимание на простейший модуль, связывающий имена с номерами дней недели – как делает метод getDay объекта Date.
5151

52-
```
52+
```js
5353
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
5454
function dayName(number) {
5555
return names[number];
@@ -63,7 +63,7 @@ console.log(dayName(1));
6363

6464
Можно сделать так:
6565

66-
```
66+
```js
6767
var dayName = function() {
6868
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
6969
return function(number) {
@@ -79,7 +79,7 @@ console.log(dayName(3));
7979

8080
Подобный шаблон можно использовать для изолирования кода. Следующий модуль пишет в консоль значение, но не предоставляет никаких значений для использования другими модулями.
8181

82-
```
82+
```js
8383
(function() {
8484
function square(x) { return x * x; }
8585
var hundred = 100;
@@ -97,7 +97,7 @@ console.log(dayName(3));
9797

9898
Представьте, что нам надо добавить ещё одну функцию в наш модуль «день недели». Мы уже не можем возвращать функцию, а должны завернуть две функции в объект.
9999

100-
```
100+
```js
101101
var weekDay = function() {
102102
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
103103
return {
@@ -112,7 +112,7 @@ console.log(weekDay.name(weekDay.number("Sunday")));
112112

113113
Когда модуль большой, собирать все возвращаемые значения в объект в конце функции неудобно, потому что многие возвращаемые функции будут большими, и вам было бы удобнее их записывать где-то в другом месте, рядом со связанным с ними кодом. Удобно объявить объект (обычно называемый exports) и добавлять к нему свойства каждый раз, когда нам надо что-то экспортировать. В следующем примере функция модуля принимает объект интерфейса как аргумент, позволяя коду снаружи функции создать его и сохранить в переменной. Снаружи функции this ссылается на объект глобальной области видимости.
114114

115-
```
115+
```js
116116
(function(exports) {
117117
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
118118

@@ -142,7 +142,7 @@ console.log(weekDay.name(weekDay.number("Saturday")));
142142

143143
Самый очевидный – оператор eval, который выполняет строку кода в текущем окружении. Это плохая идея – он нарушает некоторые свойства окружения, которые обычно у него есть, например изоляция от внешнего мира.
144144

145-
```
145+
```js
146146
function evalAndReturnX(code) {
147147
eval(code);
148148
return x;
@@ -154,7 +154,7 @@ console.log(evalAndReturnX("var x = 2"));
154154

155155
Способ лучше – использовать конструктор Function. Он принимает два аргумента – строку, содержащую список имён аргументов через запятую, и строку, содержащую тело функции.
156156

157-
```
157+
```js
158158
var plusOne = new Function("n", "return n + 1;");
159159
console.log(plusOne(4));
160160
// → 5
@@ -165,7 +165,7 @@ console.log(plusOne(4));
165165
##Require
166166
Вот минимальная версия функции require:
167167

168-
```
168+
```js
169169
function require(name) {
170170
var code = new Function("exports", readFile(name));
171171
var exports = {};
@@ -179,7 +179,7 @@ console.log(require("weekDay").name(1));
179179

180180
Так как конструктор new Function оборачивает код модуля в функцию, нам не надо писать функцию, оборачивающую пространство имён, внутри самого модуля. А так как exports является аргументом функции модуля, модулю не нужно его объявлять. Это убирает много мусора из нашего модуля-примера.
181181

182-
```
182+
```js
183183
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
184184

185185
exports.name = function(number) {
@@ -192,7 +192,7 @@ exports.number = function(name) {
192192

193193
При использовании такого шаблона модуль обычно начинается с объявления нескольких переменных, которые загружают модули, от которых он зависит.
194194

195-
```
195+
```js
196196
var weekDay = require("weekDay");
197197
var today = require("today");
198198

@@ -207,7 +207,7 @@ console.log(weekDay.name(today.dayNumber()));
207207

208208
Традиционное решение – предоставить модули с другой переменной, module, которая является объектом со свойством exports. Оно изначально указывает на пустой объект, созданный require, но может быть перезаписано другим значением, чтобы экспортировать что-либо ещё.
209209

210-
```
210+
```js
211211
function require(name) {
212212
if (name in require.cache)
213213
return require.cache[name];
@@ -235,7 +235,7 @@ require.cache = Object.create(null);
235235

236236
Наша простая программа с зависимости выглядела бы в AMD так:
237237

238-
```
238+
```js
239239
define(["weekDay", "today"], function(weekDay, today) {
240240
console.log(weekDay.name(today.dayNumber()));
241241
});
@@ -245,7 +245,7 @@ define(["weekDay", "today"], function(weekDay, today) {
245245

246246
Загруженные таким образом модули должны содержать вызовы define. В качестве их интерфейса используется то, что было возвращено функцией, переданной в define. Вот модуль weekDay:
247247

248-
```
248+
```js
249249
define([], function() {
250250
var names = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"];
251251
return {
@@ -261,7 +261,7 @@ define([], function() {
261261

262262
Функция getModule принимает имя и возвращает такой объект, и убеждается в том, что модуль поставлен в очередь загрузки. Она использует кеширующий объект, чтобы не грузить один модуль дважды.
263263

264-
```
264+
```js
265265
var defineCache = Object.create(null);
266266
var currentMod = null;
267267

@@ -285,7 +285,7 @@ function getModule(name) {
285285

286286
Функция define сама использует getModule для загрузки или создания объектов модулей для зависимостей текущего модуля. Её задача – запланировать запуск функции moduleFunction (содержащей сам код модуля) после загрузки зависимостей. Для этого она определяет функцию whenDepsLoaded, добавляемую в массив onLoad, содержащий все пока ещё не загруженные зависимости. Эта функция сразу прекращает работу, если есть ещё незагруженные зависимости, так что она выполнит свою работу только раз, когда последняя зависимость загрузится. Она также вызывается сразу из самого define, в случае когда никакие зависимости не нужно грузить.
287287

288-
```
288+
```js
289289
function define(depNames, moduleFunction) {
290290
var myMod = currentMod;
291291
var deps = depNames.map(getModule);
@@ -352,7 +352,7 @@ function define(depNames, moduleFunction) {
352352
###Названия месяцев
353353
Напишите простой модуль типа weekday, преобразующий номера месяцев (начиная с нуля) в названия и обратно. Выделите ему собственное пространство имён, т.к. ему потребуется внутренний массив с названиями месяцев, и используйте чистый JavaScript, без системы загрузки модулей.
354354

355-
```
355+
```js
356356
// Ваш код
357357

358358
console.log(month.name(2));

0 commit comments

Comments
 (0)