Kayl Poznakomtes-Javascript.642675
Kayl Poznakomtes-Javascript.642675
СИМПСОН
ПОЗНАКОМЬТЕСЬ,
JAVASCRIPT
2Е М Е Ж Д У Н А Р ОД Н О Е И З Д А Н И Е
{ }
ВЫ ПОКА
ЕЩЕ
НЕ ЗНАЕТЕ
JS
2022
ББК 32.988.02-018
УДК 004.738.5
С37
Симпсон Кайл
С37 {Вы пока еще не знаете JS} Познакомьтесь, JavaScript.
2-е изд. — СПб.: Питер, 2022. — 192 с.: ил. — (Серия
«Библиотека программиста»).
ISBN 978-5-4461-1875-5
Вы пока еще не знаете JS. И Кайл Симпсон признается, что тоже его не
знает (по крайней мере полностью)… И никто не знает. Но все мы можем
начать работать над тем, чтобы узнать его лучше. Сколько бы времени вы
ни провели за изучением языка, всегда можно найти что-то еще, что стоит
изучить и понять на другом уровне.Учтите, что, хотя книга и называется
«Познакомьтесь, JavaScript», она не для новичков. У нее другая задача:
дать обзор тем, в которых необходимо разобраться на начальном этапе
изучения JS. Даже если вы уже написали достаточно кода JS, эту книгу
не стоит пропускать, возможно, в ваших знаниях есть пробелы, которые
необходимо заполнить перед углубленным изучением сложных тем. Пора
начать изучение JS!
Оглавление
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Предисловие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Вступление. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Части языка. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Название?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Миссия. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Путь . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Полифилы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
Что такое интерпретация?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
WASM (Web Assembly) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Строго говоря. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
После определения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6
Оглавление
Прототипы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Связывание объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Снова о this. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
А теперь — «почему?». . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
7
Благодарности
9
Благодарности
11
Предисловие
12
Вступление
14
Части языка
Части языка
В этих книгах я намеренно отошел от традиционного
подхода, в котором рассматриваются хорошие части
языка. Нет, это не означает, что мы будем рассматри-
вать только плохие части — скорее рассматриваться
будут все части.
15
Вступление
16
Название?
Название?
Какой же смысл заложен в название серии?
17
Вступление
18
Название?
Миссия
На самом деле не нужно обосновывать, почему раз-
работчики должны относиться к JS серьезно, — думаю,
язык уже доказал, что заслуживает статуса перво-
классного среди языков программирования.
19
Вступление
Путь
Некоторые из вас начали читать эту книгу с целью
изучить все шесть книг от начала и до конца.
20
Название?
21
Вступление
От издательства
Ваши замечания, предложения, вопросы отправляйте
по адресу [email protected] (издательство «Питер», ком-
пьютерная редакция).
О книге
Обратите особое внимание на слово «путешествие»,
потому что хорошее знание JS — не пункт назначе-
ния, а направление. Сколько бы времени вы ни про-
вели за изучением языка, всегда можно найти что-то
еще. В общем, не рассчитывайте, что вы сможете
галопом промчаться по страницам книги и быстро
получить результат. Пока вы будете делать эти пер-
вые шаги, вашими лучшими друзьями будут терпе-
ние и настойчивость.
24
О книге
25
Глава 1. Что такое JavaScript?
26
Откуда взялось название?
27
Глава 1. Что такое JavaScript?
Спецификация языка
Я уже упоминал: TC39 — технический координаци-
онный комитет, управляющий JS. Главной задачей
комитета является создание официальной специфи-
28
Спецификация языка
29
Глава 1. Что такое JavaScript?
30
Спецификация языка
31
Глава 1. Что такое JavaScript?
Веб (JS)
Хотя набор сред, в которых выполняется JS, постоян-
но расширяется (от браузеров до серверов (Node.js),
роботов, умных лампочек…), единственной средой,
которая по-настоящему правит JS, является веб.
32
Веб (JS)
33
Глава 1. Что такое JavaScript?
34
Не только (веб) JS…
35
Глава 1. Что такое JavaScript?
Не всегда JS
Консоль/REPL (Read-Evaluate-Print-Loop) в сред-
ствах разработчика вашего браузера (или Node) на
первый взгляд выглядит достаточно элементарно.
Но на самом деле впечатление обманчиво.
36
Не всегда JS
37
Глава 1. Что такое JavaScript?
y …И другие примеры.
38
Многоликий язык
Многоликий язык
Термином «парадигма» в контексте языков програм-
мирования обозначаются широкий (почти универ-
сальный) менталитет и подход к структурированию
кода. В рамках парадигмы существует великое мно-
жество разновидностей стиля и формы, по которым
программы отличаются друг от друга, включая бес-
численные библиотеки и фреймворки, оставляющие
свой неповторимый след на любом коде.
39
Глава 1. Что такое JavaScript?
40
Прямая и обратная совместимость
Прямая и обратная
совместимость
Одним из самых фундаментальных принципов, по
которым развивается JavaScript, является обеспече-
ние обратной совместимости. Многих этот термин
сбивает с толку, и они путают его с другим, хотя и по-
хожим термином: прямой совместимостью.
41
Глава 1. Что такое JavaScript?
42
Прямая и обратная совместимость
43
Глава 1. Что такое JavaScript?
Транспиляция
Так как JS не обладает прямой совместимостью, это
означает, что всегда есть опасность разрыва между
написанным вами допустимым кодом JS и самым ста-
рым ядром, которое должно поддерживаться вашим
сайтом или приложением. Если вы запустите про-
грамму, использующую новые возможности ES2019
в ядре от 2016 года, скорее всего, это приведет к ава-
рийному завершению программы.
44
Транспиляция
if (something) {
let x = 3;
console.log(x);
}
45
Глава 1. Что такое JavaScript?
else {
let x = 4;
console.log(x);
}
46
Полифилы
Полифилы
Если проблема прямой совместимости связана не
с новым синтаксисом, а с отсутствующим методом
47
Глава 1. Что такое JavaScript?
pr
.then(renderRecords) // Вывести, если успешно.
.catch(showError) // Вывести ошибку, если нет.
.finally(hideSpinner) // В любом случае скрыть
// индикатор ожидания.
if (!Promise.prototype.finally) {
Promise.prototype.finally = function f(fn){
return this.then(
function t(v){
48
Полифилы
49
Глава 1. Что такое JavaScript?
50
Что такое интерпретация?
51
Глава 1. Что такое JavaScript?
52
Что такое интерпретация?
53
Глава 1. Что такое JavaScript?
54
Что такое интерпретация?
55
Глава 1. Что такое JavaScript?
56
WASM (Web Assembly)
57
Глава 1. Что такое JavaScript?
58
WASM (Web Assembly)
59
Глава 1. Что такое JavaScript?
60
Строго говоря
Строго говоря
В 2009 году при выходе ES5 в JS появился строгий
режим (strict) как сознательно активизируемый ме-
ханизм, способствующий повышению качества про
грамм JS.
61
Глава 1. Что такое JavaScript?
62
Строго говоря
// до директивы use-strict
// разрешены только пропуски и комментарии
"use strict";
// остаток файла выполняется в строгом режиме
function someOperations() {
// здесь могут находиться пропуски и комментарии
"use strict";
// весь этот код будет выполняться в строгом режиме
}
63
Глава 1. Что такое JavaScript?
64
После определения
После определения
JS является реализацией стандарта ECMAScript (вер-
сии 2019 на момент написания книги), который раз-
рабатывается под руководством комитета TC39 и про-
водится по инициативе ECMA. Он работает в брау-
зерах и других средах JS (например, Node.js).
65
Глава 1. Что такое JavaScript?
68
Каждый файл является программой
69
Глава 2. Обзор возможностей JS
70
Значения
Значения
Наиболее фундаментальной единицей информации
в программе является значение. Значения содержат
данные. Они используются программами для хране-
ния состояния. В JS значения существуют в двух
формах: примитивы и объекты. Значения встраива-
ются в программы в виде литералов:
greeting("My name is Kyle.");
71
Глава 2. Обзор возможностей JS
72
Значения
console.log(
`Am I confusing you by omitting interpolation?`
);
// Am I confusing you by omitting interpolation?
while (false) {
console.log(3.141592);
}
73
Глава 2. Обзор возможностей JS
74
Значения
75
Глава 2. Обзор возможностей JS
Массивы и объекты
Кроме примитивов в JS также используются объект-
ные значения.
names.length;
// 4
names[0];
// Frank
names[1];
// Kyle
76
Массивы и объекты
var me = {
first: "Kyle",
last: "Simpson",
age: 39,
specialties: [ "JS", "Table Tennis" ]
};
77
Глава 2. Обзор возможностей JS
78
Объявление и использование переменных
Объявление и использование
переменных
Пожалуй, стоит сказать то, что могло остаться неоче-
видным из предыдущего раздела: в программах JS
значения либо присутствуют в виде литералов (как
во многих предыдущих примерах), либо содержатся
в переменных; переменные можно рассматривать как
контейнеры для значений.
79
Глава 2. Обзор возможностей JS
Пример:
if (adult) {
var myName = "Kyle";
let age = 39;
console.log("Shhh, this is a secret!");
}
console.log(myName);
// Kyle
console.log(age);
// Ошибка!
80
Объявление и использование переменных
Пример:
if (myBirthday) {
age = age + 1; // OK!
myBirthday = false; // Ошибка!
}
81
Глава 2. Обзор возможностей JS
const actors = [
"Morgan Freeman", "Jennifer Aniston"
];
82
Объявление и использование переменных
function hello(myName) {
console.log(`Hello, ${ myName }.`);
}
hello("Kyle");
// Hello, Kyle.
try {
someError();
}
catch (err) {
console.log(err);
}
83
Глава 2. Обзор возможностей JS
Функции
Слово «функция» имеет много смыслов в области
программирования. Например, в мире функциональ-
ного программирования термин «функция» имеет
точное математическое определение и подразумевает
жесткий набор правил, которые должны соблюдаться.
function awesomeFunction(coolThings) {
// ..
return amazingStuff;
}
84
Функции
// let awesomeFunction = ..
// const awesomeFunction = ..
var awesomeFunction = function(coolThings) {
// ..
return amazingStuff;
};
function greeting(myName) {
console.log(`Hello, ${ myName }!`);
}
function greeting(myName) {
return `Hello, ${ myName }!`;
}
var whatToSay = {
greeting() {
console.log("Hello!");
},
question() {
console.log("What's your name?");
},
86
Сравнения
answer() {
console.log("My name is Kyle.");
}
};
whatToSay.greeting();
// Hello!
Сравнения
Чтобы принимать решения в программах, необходи-
мо сравнивать значения друг с другом, чтобы опреде-
лить их отличительные признаки и отношения друг
с другом. В JS предусмотрено несколько механизмов
сравнения значений.
87
Глава 2. Обзор возможностей JS
Не совсем так.
88
Сравнения
Пример:
89
Глава 2. Обзор возможностей JS
[ 1, 2, 3 ] === [ 1, 2, 3 ]; // false
{ a: 42 } === { a: 42 } // false
(x => x * 2) === (x => x * 2) // false
90
Сравнения
var x = [ 1, 2, 3 ];
y === x; // true
y === [ 1, 2, 3 ]; // false
x === [ 1, 2, 3 ]; // false
91
Глава 2. Обзор возможностей JS
92
Сравнения
93
Глава 2. Обзор возможностей JS
Пример:
42 == "42"; // true
1 == true; // true
94
Сравнения
Пример:
95
Глава 2. Обзор возможностей JS
var x = "10";
var y = "9";
Организация кода JS
В экосистеме JS широко применяются два основных
паттерна организации кода (данных и поведения):
классы и модули. Эти паттерны не являются взаимо-
исключающими: во многих программах можно и нуж-
но использовать оба. Другие программы могут при-
96
Организация кода JS
Классы
Термины «объектно-ориентированный», «классово-
ориентированный» и «классы» чрезвычайно сильно
перегружены подробностями и нюансами; у них нет
единственно верного определения.
97
Глава 2. Обзор возможностей JS
Пример:
class Page {
constructor(text) {
this.text = text;
}
print() {
console.log(this.text);
}
}
class Notebook {
constructor() {
this.pages = [];
}
addPage(text) {
var page = new Page(text);
this.pages.push(page);
}
print() {
for (let page of this.pages) {
page.print();
}
}
}
mathNotes.print();
// ..
98
Организация кода JS
Наследование классов
Другой аспект, присущий традиционному классово-
ориентированному проектированию, хотя и реже
применяемый в JS, — наследование (и полиморфизм).
Пример:
99
Глава 2. Обзор возможностей JS
class Publication {
constructor(title,author,pubDate) {
this.title = title;
this.author = author;
this.pubDate = pubDate;
}
print() {
console.log(`
Title: ${ this.title }
By: ${ this.author }
${ this.pubDate }
`);
}
}
print() {
super.print();
100
Организация кода JS
console.log(`
Publisher: ${ this.publisher }
ISBN: ${ this.ISBN }
`);
}
}
print() {
super.print();
console.log(this.URL);
}
}
101
Глава 2. Обзор возможностей JS
YDKJS.print();
// Title: You Don't Know JS
// By: Kyle Simpson
// June 2014
// Publisher: O'Reilly
// ISBN: 123456-789
forAgainstLet.print();
// Title: For and against let
// By: Kyle Simpson
// October 27, 2014
// https://davidwalsh.name/for-and-against-let
102
Модули
Модули
Паттерн модуля фактически преследует ту же цель,
что и паттерн класса: он предназначен для группиров-
ки данных и поведения в логических единицах. Кро-
ме того, как и в классах, модули могут «включать»
или «обращаться» к данным и поведению других
модулей с целью взаимодействия.
Классические модули
В ES6 к исходному синтаксису JS (который вскоре
будет рассмотрен) была добавлена синтаксическая
форма модулей. Однако с первых дней существования
JS модули были важным и распространенным паттер-
103
Глава 2. Обзор возможностей JS
function Publication(title,author,pubDate) {
var publicAPI = {
print() {
console.log(`
Title: ${ title }
By: ${ author }
${ pubDate }
`);
}
};
return publicAPI;
}
function Book(bookDetails) {
var pub = Publication(
bookDetails.title,
bookDetails.author,
bookDetails.publishedOn
104
Модули
);
var publicAPI = {
print() {
pub.print();
console.log(`
Publisher: ${ bookDetails.publisher }
ISBN: ${ bookDetails.ISBN }
`);
}
};
return publicAPI;
}
function BlogPost(title,author,pubDate,URL) {
var pub = Publication(title,author,pubDate);
var publicAPI = {
print() {
pub.print();
console.log(URL);
}
};
return publicAPI;
}
105
Глава 2. Обзор возможностей JS
YDKJS.print();
// Title: You Don't Know JS
// By: Kyle Simpson
// June 2014
// Publisher: O'Reilly
106
Модули
// ISBN: 123456-789
forAgainstLet.print();
// Title: For and against let
// By: Kyle Simpson
// October 27, 2014
// https://davidwalsh.name/for-and-against-let
Модули ES
Модули ES (ESM), включенные в язык JS в ES6,
должны служить практически тем же целям, что и толь-
ко что описанные классические модули, особенно с уче-
том различий в важных нюансах и сценариях исполь-
зования из AMD, UMD и CommonJS.
107
Глава 2. Обзор возможностей JS
1
Одиночка (Singleton) — порождающий паттерн проектиро-
вания. — Примеч. ред.
108
Модули
function printDetails(title,author,pubDate) {
console.log(`
Title: ${ title }
By: ${ author }
${ pubDate }
`);
}
return publicAPI;
}
function printDetails(pub,URL) {
pub.print();
console.log(URL);
}
var publicAPI = {
print() {
109
Глава 2. Обзор возможностей JS
printDetails(pub,URL);
}
};
return publicAPI;
}
forAgainstLet.print();
// Title: For and against let
// By: Kyle Simpson
// October 27, 2014
// https://davidwalsh.name/for-and-against-let
110
Кроличья нора становится глубже
111
Глава 2. Обзор возможностей JS
114
Итерации
Итерации
Так как программы по сути строятся для обработки
данных (и принятия решений на основании этих дан-
ных), паттерны, применяемые для пошагового пере-
бора данных, сильно влияют на удобочитаемость
программы.
115
Глава 3. JS: копаем вглубь
116
Итерации
Потребление итераторов
При наличии протокола итераторов ES6 появилась
возможность потребления источников данных по
одному значению; после каждого вызова next() свой-
ство done проверяется на истинность для прекраще-
ния итераций. Но в таком решении слишком многое
приходится делать вручную, поэтому ES6 также
включает несколько механизмов (на уровне синтак-
сиса и API) для стандартизированного потребления
этих итераторов.
// Iterator value: ..
// Iterator value: ..
// ..
117
Глава 3. JS: копаем вглубь
Распределение в массив:
118
Итерации
Итерируемые значения
С технической точки зрения протокол потребления
итератора определяется для потребления итерируе-
мых значений (iterables); итерируемое значение пред-
ставляет собой значение, перебор содержимого ко-
торого может осуществляться при помощи итерато-
ра.
Пример:
119
Глава 3. JS: копаем вглубь
chars;
// [ "H", "e", "l", "l", "o", " ",
// "w", "o", "r", "l", "d", "!" ]
120
Итерации
Пример:
121
Глава 3. JS: копаем вглубь
122
Замыкания
Замыкания
Почти каждый разработчик JS пользовался в своей
работе замыканиями (closures), даже если он этого не
осознавал. Собственно, замыкания являются одним
из самых распространенных видов функционально-
сти программирования в самых разных языках. Они
играют настолько фундаментальную роль, что по-
нимать их не менее важно, чем переменные или ци-
клы.
123
Глава 3. JS: копаем вглубь
Пример:
function greeting(msg) {
return function who(name) {
console.log(`${ msg }, ${ name }!`);
};
}
hello("Kyle");
// Hello, Kyle!
hello("Sarah");
// Hello, Sarah!
howdy("Grant");
// Howdy, Grant!
124
Замыкания
function counter(step = 1) {
var count = 0;
return function increaseCount(){
count = count + step;
return count;
};
125
Глава 3. JS: копаем вглубь
incBy1(); // 1
incBy1(); // 2
incBy3(); // 3
incBy3(); // 6
incBy3(); // 9
function getSomeData(url) {
ajax(url,function onResponse(resp){
console.log(
`Response (from ${ url }): ${ resp }`
);
});
}
126
Замыкания
getSomeData("https://some.url/wherever");
// Response (from https://some.url/wherever): ...
127
Глава 3. JS: копаем вглубь
128
Ключевое слово this
129
Глава 3. JS: копаем вглубь
function classroom(teacher) {
return function study() {
console.log(
`${ teacher } says to study ${ this.topic }`
);
};
}
var assignment = classroom("Kyle");
assignment();
// Kyle says to study undefined -- Oops :(
130
Ключевое слово this
Пример:
var homework = {
topic: "JS",
assignment: assignment
};
homework.assignment();
// Kyle says to study JS
131
Глава 3. JS: копаем вглубь
И наконец:
var otherHomework = {
topic: "Math"
};
assignment.call(otherHomework);
// Kyle says to study Math
132
Прототипы
Прототипы
Если this является характеристикой выполнения
функции, прототип является характеристикой объ-
екта и конкретного преобразования обращения к свой-
ству.
var homework = {
topic: "JS"
};
133
Глава 3. JS: копаем вглубь
Связывание объектов
Чтобы определить связывание с прототипом объекта,
можно создать объект служебным методом Object.
create(..):
var homework = {
topic: "JS"
};
otherHomework.topic; // "JS"
134
Прототипы
135
Глава 3. JS: копаем вглубь
Пример:
homework.topic;
// "JS"
otherHomework.topic;
// "JS"
otherHomework.topic = "Math";
otherHomework.topic;
// "Math"
homework.topic;
// "JS" -- не "Math"
137
Глава 3. JS: копаем вглубь
Снова о this
Ключевое слово this уже рассматривалось выше, но
по-настоящему его важность проявляется тогда, ког-
да вы начинаете рассматривать вызовы функций с де-
легированием прототипам. Собственно, одна из глав-
ных причин, по которым this поддерживает динами-
ческий контекст, основанный на том, как была
вызвана функция, заключается в том, что вызовы
методов для объектов, делегируемые по цепочке про-
тотипов, продолжают поддерживать ожидаемое зна-
чение this.
Пример:
var homework = {
study() {
console.log(`Please study ${ this.topic }`);
}
};
138
Прототипы
139
Глава 3. JS: копаем вглубь
А теперь «почему?»
Из этой главы прежде всего следует, что во внутренней
реализации JS происходит гораздо больше, чем ка-
жется на первый взгляд.
140
А теперь «почему?»
144
Столп 1: области видимости и замыкания
145
Глава 4. Общая картина
146
Столп 2: прототипы
Столп 2: прототипы
Вторым столпом языка является система прототипов.
Эта тема подробно рассматривалась в главе 3, раздел
«Прототипы», но хочу просто сделать несколько за-
мечаний относительно ее важности. JS — один из
очень немногих языков, в которых объекты можно
создавать явно и непосредственно, без предваритель-
ного определения их структуры в классе.
147
Глава 4. Общая картина
148
Столп 3: типы и преобразования
149
Глава 4. Общая картина
150
По ветру
По ветру
Дам совет относительно того, как вам продолжать свое
познавательное путешествие по JS и ваш путь по
остальным книгам серии: помните о ветре.
1
Симпсон К. {Вы не знаете JS} Типы и грамматические кон-
струкции. — СПб.: Питер, 2020. — 240 с.: ил.— Примеч.
ред.
151
Глава 4. Общая картина
152
По ветру
153
Глава 4. Общая картина
154
По ветру
По порядку
Итак, теперь у вас имеется более широкое представ-
ление о том, что вам предстоит исследовать в JS, и пра-
вильный настрой, с которым вы отправитесь в свое
путешествие.
155
Глава 4. Общая картина
1
Симпсон К. {Вы не знаете JS} Замыкания и объекты. — СПб.:
Питер, 2020. — 336 с.: ил. — Примеч. ред.
2
Симпсон К. {Вы не знаете JS} Асинхронная обработка и оп-
тимизация. — СПб.: Питер, 2021. — 352 с. — Примеч. ред.
3
Симпсон К. ES6 и не только. — СПб.: Питер, 2018. — 336 с.:
ил. — Примеч. ред.
156
По ветру
157
Глава 4. Общая картина
Значения и ссылки
В главе 2 были представлены две разновидности зна-
чений: примитивы и объекты. Однако мы еще не об-
судили одно ключевое отличие между ними: то, как
эти значения присваиваются и передаются при вы-
зове.
160
Значения и ссылки
myName = "Frank";
console.log(myName);
// Frank
console.log(yourName);
// Kyle
161
Приложение А. Дальнейшее изучение
Пример:
var myAddress = {
street: "123 JS Blvd",
city: "Austin",
state: "TX"
};
console.log(yourAddress.street);
// 456 TS Ave
162
Многоликие функции
Многоликие функции
Вспомните следующий фрагмент из раздела «Функ-
ции» главы 2:
awesomeFunction.name;
// "awesomeFunction"
163
Приложение А. Дальнейшее изучение
// let awesomeFunction = ..
// const awesomeFunction = ..
var awesomeFunction = function someName(coolThings) {
// ..
return amazingStuff;
};
awesomeFunction.name;
// "someName"
164
Многоликие функции
165
Приложение А. Дальнейшее изучение
// Объявление функции-генератора
function *two() { .. }
// IIFE
(function(){ .. })();
(function namedIIFE(){ .. })();
// asynchronous IIFE
166
Многоликие функции
167
Приложение А. Дальнейшее изучение
class SomethingKindaGreat {
// class methods
coolMethod() { .. } // без запятых!
boringMethod() { .. }
}
var EntirelyDifferent = {
// object methods
coolMethod() { .. }, // с запятыми!
boringMethod() { .. },
168
Многоликие функции
Пример:
var x = 1;
if (x) {
// будет выполнено!
}
while (x) {
// будет выполнено один раз!
x = false;
}
var x = 1;
if (x == true) {
// будет выполнено!
}
169
Приложение А. Дальнейшее изучение
while (x == true) {
// будет выполнено один раз!
x = false;
}
var x = "hello";
if (x) {
// будет выполнено!
}
if (x == true) {
// не будет выполнено :(
}
var x = "hello";
if (Boolean(x) == true) {
// будет выполнено
}
170
Прототипические классы
Прототипические классы
В главе 3 были представлены прототипы, и вы узнали,
как объекты связываются через цепочку прототипов.
171
Приложение А. Дальнейшее изучение
var Classroom = {
welcome() {
console.log("Welcome, students!");
}
};
mathClass.welcome();
// Welcome, students!
function Classroom() {
// ..
}
mathClass.welcome();
// Welcome, students!
172
Прототипические классы
class Classroom {
constructor() {
// ..
}
welcome() {
console.log("Welcome, students!");
}
}
173
Приложение А. Дальнейшее изучение
mathClass.welcome();
// Welcome, students!
Сравнения
Потренируемся в работе с типами значений и срав-
нениями (глава 4, столп 3), в которых должны быть
задействованы преобразования типов.
function scheduleMeeting(startTime,durationMinutes) {
// ..TODO..
}
scheduleMeeting("7:00",15); // false
scheduleMeeting("07:15",30); // false
scheduleMeeting("7:30",30); // true
scheduleMeeting("11:30",60); // true
scheduleMeeting("17:00",45); // true
176
Замыкания
scheduleMeeting("17:30",30); // false
scheduleMeeting("18:00",15); // false
Замыкания
Теперь попрактикуемся в использовании замыканий
(глава 4, столп 1).
function range(start,end) {
// ..TODO..
}
range(3,3); // [3]
range(3,8); // [3,4,5,6,7,8]
range(3,0); // []
177
Приложение Б. Практика, практика, практика!
start3(3); // [3]
start3(8); // [3,4,5,6,7,8]
start3(0); // []
start4(6); // [4,5,6]
Прототипы
Наконец, потренируемся в использовании this и объ-
ектов, связанных через прототип (глава 4, столп 2).
178
Прототипы
function randMax(max) {
return Math.trunc(1E9 * Math.random()) % max;
}
var reel = {
symbols: [
"X", "Y", "Z", "W", "$", "*", "<", "@"
],
spin() {
if (this.position == null) {
this.position = randMax(
this.symbols.length - 1
);
}
this.position = (
this.position + 100 + randMax(100)
) % this.symbols.length;
},
display() {
if (this.position == null) {
this.position = randMax(
this.symbols.length - 1
);
}
return this.symbols[this.position];
}
};
179
Приложение Б. Практика, практика, практика!
var slotMachine = {
reels: [
// потребуются 3 отдельных объекта reel
// подсказка: Object.create(..)
],
spin() {
this.reels.forEach(function spinReel(reel){
reel.spin();
});
},
display() {
// TODO
}
};
slotMachine.spin();
slotMachine.display();
// < | @ | *
// @ | X | <
// X | Y | @
slotMachine.spin();
slotMachine.display();
// Z | X | W
// W | Y | $
// $ | Z | *
Подсказки
180
Предлагаемые решения
Предлагаемые решения
Учтите, что здесь предлагается лишь один из вариан-
тов решения. У этих упражнений есть много потен-
циальных решений. Сравните свой подход с приве-
денным, проанализируйте достоинства и недостатки
каждого варианта.
181
Приложение Б. Практика, практика, практика!
function scheduleMeeting(startTime,durationMinutes) {
var [ , meetingStartHour, meetingStartMinutes ] =
startTime.match(/^(\d{1,2}):(\d{2})$/) || [];
durationMinutes = Number(durationMinutes);
if (
typeof meetingStartHour == "string" &&
typeof meetingStartMinutes == "string"
) {
let durationHours =
Math.floor(durationMinutes / 60);
durationMinutes =
durationMinutes - (durationHours * 60);
let meetingEndHour =
Number(meetingStartHour) + durationHours;
let meetingEndMinutes =
Number(meetingStartMinutes) +
durationMinutes;
182
Предлагаемые решения
}`;
return false;
}
scheduleMeeting("7:00",15); // false
scheduleMeeting("07:15",30); // false
scheduleMeeting("7:30",30); // true
scheduleMeeting("11:30",60); // true
scheduleMeeting("17:00",45); // true
scheduleMeeting("17:30",30); // false
scheduleMeeting("18:00",15); // false
function range(start,end) {
start = Number(start) || 0;
183
Приложение Б. Практика, практика, практика!
else {
end = Number(end) || 0;
return getRange(start,end);
}
// **********************
function getRange(start,end) {
var ret = [];
for (let i = start; i <= end; i++) {
ret.push(i);
}
return ret;
}
}
range(3,3); // [3]
range(3,8); // [3,4,5,6,7,8]
range(3,0); // []
start3(3); // [3]
start3(8); // [3,4,5,6,7,8]
start3(0); // []
start4(6); // [4,5,6]
function randMax(max) {
return Math.trunc(1E9 * Math.random()) % max;
}
184
Предлагаемые решения
var reel = {
symbols: [
"X", "Y", "Z", "W", "$", "*", "<", "@"
],
spin() {
if (this.position == null) {
this.position = randMax(
this.symbols.length - 1
);
}
this.position = (
this.position + 100 + randMax(100)
) % this.symbols.length;
},
display() {
if (this.position == null) {
this.position = randMax(
this.symbols.length - 1
);
}
return this.symbols[this.position];
}
};
var slotMachine = {
reels: [
Object.create(reel),
Object.create(reel),
Object.create(reel)
],
spin() {
this.reels.forEach(function spinReel(reel){
reel.spin();
});
},
display() {
185
Приложение Б. Практика, практика, практика!
return lines.join("\n");
}
};
slotMachine.spin();
slotMachine.display();
// < | @ | *
// @ | X | <
// X | Y | @
slotMachine.spin();
slotMachine.display();
// Z | X | W
// W | Y | $
// $ | Z | *
186
Предлагаемые решения
КУПИТЬ