Предисловие		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