Meshbeyn / JavaScript

Конспект по Javascript

1 Введение, типы данных

Введение

JavaScript - скриптовый язык, используемый в основном для программирования действий страниц HTML. Официальный первый релиз языка вышел в марте 1996 в составе Netscape 2. Затем язык прошел открытую стандартизацию в организации ECMA как ECMAScript или ECMA-262. Кроме веб страниц, этот язык стал использоваться для скриптования приложений как конкурент VBScript/VBA.

JavaScript может похвастаться всеми плюсами и минусами скриптовых языков. Этот язык гораздо проще синтаксически, чем полноценные языки программирования, имеет упрощенную систему типов и автоматическое приведение типов со сборкой мусора. Это дает ложное ощущение простоты использования языка. На самом деле, этот язык становится серьезной помехой даже для не очень сложных проектов. Крупные проекты гарантированно будут иметь очень высокую стоимость разработки и особенно отладки. Особенно усложняет разработку тот факт, что разные браузеры имеют разные объектные модели (хоть и очень схожие). Поэтому программирование вебстраниц усложняется проверками версий браузеров и выполнением одного действия разными способами. Популярные библиотеки помогают скрыть в себе существенное количество такого кода, но это требует изучения и обновления этих постоянно изменяющихся библиотек, а также немного замедляет и без того не слишком быстрый язык.

На вебстраницах текст скриптов может указываться тремя способами:

  1. Подключением файла тегом script:
    <script src="URL файла"></script>
  2. Включением скрипта в тег script:
    <script>
    Текст скрипта
    </script>
  3. Включением скрипта в атрибут тега (обычно в событие click):
    <a id="test" onclick="alert('test')">test</a>

Текст скрипта выполняется как это обычно происходит в скриптовых языках: команды выполняются по порядку, а объявления функций и других объектов просто делают этот объект известным интерпретатору. Команды могут разделяться точкой с запятой или просто переносом строки. Рекомендуется всегда ставить точку с запятой: это упрощает чтение для программистов на других C-подобных языках и избавляет от проблем в случае утери переноса строки (парсер HTML перенос строки может заменить но пробел).

JavaScript использует стандартные комментарии C: // для строчных комментариев и /* */ для многострочных. Текст скрипта может помещаться в комментарии в HTML или в секцию CDATA в XML, чтобы неподдерживающие его браузеры не пытались обработать текст.

Типы данных

JavaScript имеет очень упрощенную систему типов данных. Причем переменные не имеют жесткой типизации. Тип переменной меняется вместе с ее значением. Поэтому тип значения также должен храниться в переменной и перед выполнением операции интерпретатор вынужден сверяться с текущим типом. Это основная проблема для производительности в JavaScript. Современные интерпретаторы пытаются оптимизировать большой блок кода, если определяют гарантированный тип, но такие проверки могут занимать гораздо больше времени, чем выполнение полезных действий. JavaScript определяет 7 типов данных: Number, String, Boolean, Object, Array, Null, Undefined. Тип выражения можно определить оператором typeof(выражение). Но для значений null и для массивов этот оператор также вернет "object".

Number

Числа всегда хранятся как вещественные в формате IEEE 754 (восьмибайтовое вещественное число - double). Числовой литерал может быть целочисленным. Целочисленный литерал может быть десятичным (цифры 0-9), шестнадцатеричным (префикс 0x и цифры 0-f) или восьмеричным (префикс 0 и цифры 0-7). Вещественный литерал может быть в диапазоне 5e-324 - 1.79769e308.

Также определены специальные значения:

String

Строка - это последовательность символов. Строковый литерал может заключаться в одинарные или двойные кавычки. Разницы нет, это сделано для удобства: если строка окружена двойными кавычками, одинарные кавычки можно применять без экранирования и наоборот. JavaScript поддерживает все экранирующие последовательности, что и C. Для экранирования произвольного символа Юникода используется последовательность \uHHHH.

Boolean

Булевый тип имеет только два значения: true и false. Переменные этого типа обычно используются для управления потоком скрипта.

Null

Нулевой тип имеет одно значение: null. Это значение используют, чтобы показать, что переменная действительно не содержит значения.

Undefined

Неопределенный тип имеет одно значение: undefined. Это значение имеет переменная до того, как ей присвоили первое значение. Если обратиться к несуществующему свойству объекта, оно также вернет значение undefined.

Object

Объект в JavaScript - это коллекция полей (переменных) и методов (функций). Элементы объекта могут добавляться и удаляться во время выполнения. Понятия объектно-ориентированного программирования отсутствуют, но есть техники вроде конструкторной функции и прототипирования, которые позволяют получать нечто похожее на "правильное" объектно-ориентированное программирование. Объекты - это очень большая тема, которая получит еще несколько отдельных статей.

Array

Массивы в JavaScript - это универсальные коллекции. Они могут вести себя как массивы, словари (ассоциативные массивы), стеки, динамические массивы, разреженные массивы. Массивам также будет посвящена отдельная статья.

Автоматическое приведение типов

Если в выражении встречаются подвыражения разных типов, они приводятся следующим образом:

Number + String -> String + String (числовые операторы как * вернут NaN)

Boolean + String -> String + String

Number + Boolean -> Number + Number

Number + null -> Number + 0

Number * null -> Number * 0

Number + undefined -> undefined

String + undefined -> String + "undefined"

String + null -> String + "null"