Предисловие 9
Введение 12
JavaScript в сравнении с ECMAScript 13
Веб-программирование 13
Замечание по поводу параллелизма 14
Благодарности 15
Об авторе 18
Глава 1. Подготовка к программированию на JavaScript 19
1. Заранее узнайте, какая версия JavaScript используется 20
2. Разберитесь с числами с плавающей точкой 28
3. Остерегайтесь неявного приведения типов данных 32
4. Отдавайте предпочтение примитивам, а не объектным оболочкам 40
5. Избегайте использования оператора со смешанными типами 42
6. Разберитесь с ограничениями на использование точки с запятой 46
7. Рассматривайте строки в виде последовательности 16-разрядных байтовых представлений кодов 55
Глава 2. Область видимости переменных 61
8. Старайтесь как можно меньше использовать глобальный объект 61
9. Всегда объявляйте локальные переменные 65
10. Избегайте ключевого слова with 67
11. Освойте механизм замыканий 72
12. Разберитесь с подъемом переменных 76
13. Используйте немедленно вызываемые функции-выражения для создания локальных
областей видимости 79
14. Остерегайтесь использования непереносимых областей видимости, возникающих при использовании именованных функций-выражений 83
15. Остерегайтесь непереносимых областей видимости, возникающих из-за объявления функций внутри локальных блоков 88
16. Избегайте создания локальных переменных с помощью функции eval 91
17. Используйте непрямой вызов функции eval вместо прямого 93
Глава 3. Использование функций 96
18. Разберитесь в различиях между вызовами функций, методов и конструкторов 96
19. Научитесь пользоваться функциями высшего порядка 100
20. Используйте метод call для вызова методов с произвольным получателем 105
21. Используйте метод apply для вызова функций с разным количеством аргументов 107
22. Используйте объект arguments для создания вариативных функций 110
23. Никогда не вносите изменений в объект arguments 112
24. Используйте переменную для сохранения ссылки на объект arguments 115
25. Используйте метод bind для извлечения методов с фиксированным получателем 117
26. Используйте метод bind для каррирования функций 120
27. При инкапсуляции кода отдавайте предпочтение замыканиям, а не строкам 122
28. Избегайте использования метода toString функций 124
29. Избегайте нестандартных свойств инспектирования стека 127
Глава 4. Объекты и прототипы 130
30. Разберитесь в различиях между механизмами prototype, getPrototypeOf и proto 131
31. Отдавайте предпочтение функции Object.getPrototypeOf, а не свойству proto 135
32. Никогда не вносите изменения в свойство proto 136
33. Создавайте свои конструкторы так, чтобы их не нужно было вызывать с оператором new 138
34. Храните методы в прототипах 142
35. Для хранения закрытых данных используйте замыкания 144
36. Храните состояние экземпляра только в объектах-экземплярах 147
37. Разберитесь с неявным связыванием this 150
38. Вызывайте конструкторы суперкласса из конструкторов подкласса 154
39. Не используйте повторно имена свойств суперкласса 159
40. Избегайте наследования от стандартных классов 161
41. Считайте прототипы деталями реализации 164
42. Не пытайтесь бездумно вносить изменения методом обезьяньей правки 166
Глава 5. Массивы и словари 169
43. Создавайте простые словари только из непосредственных экземпляров объектов 169
44. Используйте прототипы равные null для предотвращения прототипного загрязнения 173
45. Используйте метод hasOwnProperty для защиты от прототипного загрязнения 176
46. Отдавайте предпочтение массивам, а не словарям при работе с упорядоченными коллекциями 182
47. Не добавляйте перечисляемые свойства к Object.prototype 186
48. Избегайте модификации объекта в ходе перечисления 188
49. При последовательном переборе элементов массива отдавайте предпочтение циклу for, а не циклу for...in 194
50. При работе с циклами отдавайте предпочтение итерационным методам 196
51. Повторно используйте обобщенные методы прототипа Array для объектов, похожих на массивы 202
52. Отдавайте предпочтение литералам массивов, а не конструктору Array 205
Глава 6. Разработка библиотек и API 207
53. Придерживайтесь неизменных соглашений 207
54. Рассматривайте вариант undefined как «нет значения» 210
55. Применяйте для аргументов, требующих описания, объекты параметров 216
56. Избегайте ненужных данных о состоянии. 222
57. Используйте структурную типизацию для создания гибких интерфейсов 226
58. Различайте массив и подобие массива 232
59. Избегайте избыточного приведения типов данных 237
60. Выстраивайте цепочки методов 242
Глава 7. Параллелизм 246
61. Не блокируйте очередь событий при вводе-выводе 247
62. Используйте вложенные или именованные функции обратного вызова для задания последовательности выполнения асинхронных команд 252
63. Не забывайте о существовании игнорируемых ошибок 257
64. Используйте рекурсию для асинхронных циклов 262
65. Не блокируйте очередь событий вычислениями 267
66. Используйте счетчик для выполнения параллельных операций 272
67. Не вызывайте асинхронные функции обратного вызова в синхронном режиме 278
68. Используйте обязательства для более понятной асинхронной логики 282