<b> //Нарисовать отметки лет на оси Х</b>
<b> g.textAling="center"; //Текст меток по центру </b>
<b> var y = amounToY(0); //Координата Y на оси X</b>
<b> for (var year=1;year*12 <= payments; year++) { //Для каждого года </b>
<b> var x=paymentToX(year*12); //Вычислить позицию метки </b>
<b> g.fillRect(x-0.5, y-3, 1, 3); //Нарисовать метку </b>
<b> if (year == 1) g.fillText("Year", x, y-5); // Подписать ось </b>
<b> if (year % 5 == 0 && year*12 !== payments) // Числа через каждые 5 лет</b>
<b> g.fillText(String(year), x, y-5);</b>
<b> }</b>
<b> //Суммы платежей у правой границы</b>
<b> g.textAling="right"; //Текст по правому краю </b>
<b> g.textBaseLine="middle"; //Центрировать по вертикали </b>
<b> var ticks = [monthly*payments, principal]; //Вывести две суммы </b>
<b> var rightEdge = paymentToX(payments); //Координата X на оси Y </b>
<b> for (var i = 0; i < ticks.Length; i++) { //Для каждой из 2 сумм </b>
<b> var y = amountToY(ticks[i]); //Определить координату Y </b>
<b> g.fillRect(rightEdge - 3, y - 0.5, 3, 1); //Нарисовать метку </b>
<b> g.fillText(String(ticks[i].toFixed(0)), //И вывести рядом сумму.</b>
<b> rightEdge-5, y);</b>
<b> }</b>
<b>}</b>
<b></script></b>
<b></body></b>
<b></html></b>
I
Базовый JavaScript
Данная часть книги включает главы со 2 по 12, она описывает базовый язык JavaScript и задумана как справочник по языку JavaScript. Прочитав главы этой части один раз, вы, возможно, будете неоднократно возвращаться к ним, чтобы освежить в памяти более сложные особенности языка.
• Глава 2 «Лексическая структура»
• Глава 3 «Типы данных, значения и переменные»
• Глава 4 «Выражения и операторы»
• Глава 5 «Инструкции»
• Глава 6 «Объекты»
• Глава 7 «Массивы»
• Глава 8 «Функции»
• Глава 9 «Классы и модули»
• Глава 10 «Шаблоны и регулярные выражения»
• Глава 11 «Подмножества и расширения JavaScript»
• Глава 12 «Серверный JavaScript»
2
Лексическая структура
Лексическая структура языка программирования - это набор элементарных правил, определяющих, как пишутся программы на этом языке. Это низкоуровневый синтаксис языка; он определяет вид имен переменных, символы, используемые для обозначения комментариев, и то, как одна инструкция отделяется от другой. Эта короткая глава описывает лексическую структуру JavaScript.
2.1. Набор символов
При написании программ на JavaScript используется набор символов Юникода. Юникод является надмножеством кодировок ASCII и Latin-І и поддерживает практически все письменные языки, имеющиеся на планете. Стандарт ЕСМА-Script 3 требует, чтобы реализации JavaScript обеспечивали поддержку стандарта Юникода версии 2.1 или выше, а стандарт ECMAScript 5 требует, чтобы реализации обеспечивали поддержку стандарта Юникода версии 3 или выше. Более подробно о Юникоде и JavaScript говорится во врезке в разделе 3.2.
2.1.1. Чувствительность к регистру
JavaScript - это язык, чувствительный к регистру символов. Это значит, что ключевые слова, имена переменных и функций и любые другие идентификаторы языка должны всегда содержать одинаковые наборы прописных и строчных букв. Например, ключевое слово
<b>while</b>
должно набираться как «while», а не «While» или «WHILE». Аналогично
<b>online, Online, OnLine и ONLINE</b>
- это имена четырех разных переменных.
Заметим, однако, что язык разметки HTML (в отличие от XHTML) не чувствителен к регистру. Так как HTML и клиентский JavaScript тесно связаны, это различие может привести к путанице. Многие JavaScript-объекты и их свойства имеют те же имена, что и теги и атрибуты языка HTML, которые они обозначают. Однако если в HTML эти теги и атрибуты могут набираться в любом регистре, то в JavaScript они обычно должны набираться строчными буквами. Например, атрибут
<b>onclick</b>
обработчика события чаще всего задается в HTML как onClick, однако в JavaScript-коде (или в XHTML-документе) он должен быть обозначен как
<b>onclick</b>
.
2.1.2. Пробелы, переводы строк и символы управления форматом
JavaScript игнорирует пробелы, которые могут присутствовать между лексемами в программе. Кроме того, JavaScript также по большей части игнорирует символы перевода строки (за одним исключением, о котором рассказывается в разделе 2.5). Поэтому пробелы и символы перевода строки могут без ограничений использоваться в исходных текстах программ для форматирования и придания им удобочитаемого внешнего вида.
Помимо обычного символа пробела (
<b>\u0020</b>
) JavaScript дополнительно распознает как пробельные следующие символы: табуляция (
<b>\u0009</b>
), вертикальная табуляция (
<b>\u000В</b>
), перевод формата (
<b>\u000C</b>
), неразрывный пробел (
<b>\u00А0</b>
), маркер порядка следования байтов (
<b>\uFEFF</b>
), а также все символы Юникода, относящиеся к категории Zs. Следующие символы распознаются интерпретаторами JavaScript как символы конца строки: перевод строки (
<b>\u000А</b>
), возврат каретки (
<b>\u000D</b>
), разделитель строк (
<b>\u2028</b>
) и разделитель абзацев (
<b>\u2029</b>
). Последовательность из символов возврата каретки и перевода строки интерпретируется как единственный символ завершения строки.
Символы Юникода, управляющие форматом (категория Cf), такие как RIGHT-TO-LEFT MARK (
<b>\u200F</b>
) и LEFT-TO-RIGHT MARK (
<b>\u200E</b>
), управляют визуальным представлением текста, в котором они присутствуют. Они имеют большое значение для корректного отображения текста на некоторых языках и являются допустимыми в комментариях JavaScript, строковых литералах и в литералах регулярных выражений, но не в идентификаторах (таких как имена переменных), определяемых в программах JavaScript. Исключение составляют ZERO WIDTH JOINER (
<b>\u200D</b>
) и ZERO WIDTH NON-JOINER (
<b>\u200C</b>
), которые можно использовать в идентификаторах при условии, что они не являются первыми символами идентификаторов. Как отмечалось выше, символ управления порядком следования байтов (
<b>\uFEFF</b>
) интерпретируется как пробельный символ.