Немного о JavaScript
Хотя кого я обманываю, получилась достаточно увесистая глава
В данный раздел я вынес ту информацию о JavaScript, которую необходимо знать, чтобы у вас не возникало «детских» проблем с использованием jQuery. Если у вас есть опыт работы с JavaScript, то листайте далее.
Изучать хотите JavaScript и jQuery? Так силу познайте инструмента истинного:
Developer Tools - для Chrome, Safari, Opera и других webkit-based браузеров
Developer Tools - для FireFox
Developer Tools - для Microsoft Edge
Список не полон, но console там есть, применять её надо уметь
О форматировании
Хотел бы сразу обратить внимание на форматирование JavaScript-кода. Мой опыт мне подсказывает — лучше всего спроецировать стандарты форматирования основного языка разработки на прикладной — JavaScript, а если вы хотите чего-нить из глобального и общепринятого, то я для вас уже погуглил:
jQuery Core Style Guidelines — руководство от разработчиков jQuery
Airbnb JavaScript Style Guide — бест практикс для JavaScript-разработчиков
Как писать неподдерживаемый код? — вредные советы от Ильи
В довесок поделюсь небольшим советом: все переменные, содержащие объект jQuery, лучше всего именовать, начиная с символа «$». Поверьте, такая небольшая хитрость экономит много времени.
Основы JavaScript
Переменные
Первое, с чем мы столкнемся — это объявление переменных:
Всё просто, объявляем переменную, используя ключевое слово var
.
Можно, конечно же, и без var
, но делать я вам это настоятельно не рекомендую, т.к. могут возникнуть непредвиденные проблемы в коде, о чём чуть позже расскажу.
Да, да, JavaScript относится к языкам с динамической типизацией, и нам нет нужды указывать тип данных при объявлении переменных, вы даже можете устроить «holy war» по этому поводу, но делайте это локально, не выходя за рамки своей черепной коробки.
На имена переменных наложено два ограничения:
имя может состоять из букв, цифр, и символов «$» и «_»
первый символ не должен быть цифрой
Учтите, регистр букв имеет значение:
Хочу также вас познакомить с таким нововведением ES6 (он же ECMAScript-2015 или ES-2015), как объявление переменных с использованием конструкции let
:
Внешне, от var
не сильно отличается, зато какая разница в поведении:
область видимости переменной
let
ограничена блоком{...}
, в отличие отvar
, которая видна везде внутри функции:вот так ведёт себя переменная объявленная с помощью
var
:а теперь сравните с поведением
let
:переменная
let
видна только после объявления:«
var
»:«
let
»:переменную
let
нельзя объявить повторно:«
var
»:«
let
»:внутри цикла переменная
let
будет объявлена новая для каждой итерации:«
var
»:«
let
»:
Вот вам следующее задание - угадайте значение x
и y
в следующем примере:
Константы
В JavaScript до ES6 не было констант, но поскольку необходимость в них всё же была и до того, то была негласная договоренность: переменные, набранные в верхнем регистре через подчёркивание, не изменять:
Такие константы необходимы, чтобы избежать появления «magic numbers».
Взгляните на следующий код if(status==2)
— о чём тут речь, мало кому будет понятно, а вот код if(status==USER_STATUS_BANNED)
уже более информативный.
Если же говорить об эре ES-2015, то тут уже используем const
, а об остальном уже позаботится сам JavaScript:
Да-да, я повторюсь, это наглядный пример правильного именования констант — имя однозначно указывает на хранимое значение — «статус активного пользователя».
Отдельно стоит заметить, константа не позволяет изменять саму переменную, но если мы присвоим константе объект или массив, то с ним вы сможете делать что душа пожелает:
Вот и получился «читаемый» код, мотайте на ус
Типы данных
В JavaScript не так уж и много типов данных:
number — целое или дробное число:
также существуют следующие специальные значения:
Infinity
— за гранью 1.7976931348623157E+10308 (т.е. больше)-Infinity
— за гранью -1.7976931348623157E+10308 (т.е. меньше)NaN (not-a-number)
— результат числовой операции, которая завершилась ошибкой; для образца запустите следующий код в консоли:но учтите – есть только один правильный способ проверки результата вычисления на
NaN
:и много неправильных:
string — строка, заключается в кавычки:
В JavaScript нет разницы между двойными кавычками и одинарными, достаточно соблюдения их парности (привет PHP и Ruby).
boolean — булево значение, т.е. или «
true
» или «false
»object — это объекты; на них остановлюсь подробнее чуть позже…
symbol — тип данных из ES6, служит для создания уникальных идентификаторов (о нём рассказа не будет, не в ходу ещё)
null — специальное значение для определения «пустоты»
undefined — ещё одно специальное значение, для «неопределенности», используется как значение неопределённой или несуществующей переменной, например, если переменная объявлена, но значение ей ещё не присвоено:
Во втором примере нас может ожидать сюрприз, если что-то определит переменную «undefined»; как обойти такую «неприятность», я ещё расскажу.
Хотел ещё акцентировать ваше внимание на приведение типов в JavaScript. Этот момент вызывает много вопросов у начинающих разработчиков, а ошибки связанные с ним будут преследовать вас первые полгода работы. Откройте страничку учебника об особенностях операторов, изучите её, а когда будете готовы переходите к выполнению следующего задания.
Посмотрите внимательно на код, и скажите - каков будет результат вычисления:
Массивы
Массив — это коллекция данных с числовыми индексами. Данные могут быть любого типа, в качестве примера я приведу один из самых простых вариантов — массив со строками:
Нумерация массивов начинается с «0», так что для получения первого элемента вам потребуется следующий код:
Размер массива хранится в свойстве length:
В действительности length
возвращает индекс последнего элемента массива+1, так что не попадитесь на следующую «ошибку новичка»:
Для перебора массива лучше всего использовать цикл for(;;)
:
На предыдущем примере цикл покажет четыре значения undefined
, что может вызвать проблемы, и только затем будет работать со значением 10
. Иначе действует похожий, но не равнозначный цикл for (in)
(он сразу возьмётся за значение 10
). Пример цикла:
Для работы с последним элементом массива следует использовать методы push()
и pop()
:
Для работы с первым элементом массива следует использовать методы unshift()
и shift()
:
Последние два метода работают медленно, т.к. перестраивают весь массив пошагово.
Упражнение для закрепления материала:
как мне получить пользователя по имени
Andrey
из массиваusers
?какова длина массива?
Функции
С функциями в JavaScript всё просто, вот вам элементарный пример:
Просто, пока не заговорить об анонимных функциях…
Анонимные функции
В JavaScript можно создать анонимную функцию (т.е. функцию без имени), для этого достаточно слегка изменить предыдущую конструкцию:
Так как функция — это вполне себе объект, то её можно присвоить переменной, и (или) передать в качестве параметра в другую функцию:
Анонимную функцию можно создать и тут же вызвать с необходимыми параметрами:
Это несложно, скоро вы к ним привыкнете, и вам их будет недоставать в других языках.
Стрелочные функции
Ах, этот ES6 – он принёс ещё более краткую форму для создания функций, это так называемые «функции-стрелки»:
Данная запись конечно же, удобная, но не стоит увлекаться, так как если перестараться, то ваш код станет нечитаем, и по итогу вы можете услышать много нелестных выражений в свой адрес.
Функции-стрелки обладают ещё некоторыми особенностями, но это всё же не учебник по JavaScript ;)
Решите простую FizzBuzz-задачку:
Необходимо написать функцию, которая будет в качестве аргумента принимать число, если число кратно 3, то функция должна выводить
Fizz
, если число кратно 5, тоBuzz
, если число кратно и 3 и 5, то функция должна вернутьFizzBuzz
, иначе возвращать само число
Объекты
На объекты в JavaScript возложено две роли:
хранилище данных
функционал объекта
Первое предназначение можно описать следующим кодом:
Это, фактически, реализация key-value хранилища, или хэша, или ассоциативного массива, или …. Ну, вы поняли, названий много. В JavaScript это объект, а запись выше – это JSON или JavaScript Object Notation (хоть и с небольшими оговорками).
Для перебора такого хранилища можно использовать цикл for(.. in ..)
:
Классы
С классами, конструкторами и т.д. в JavaScript посложнее будет, хотя для понимания не так уж много и надо. Запоминайте: любая функция, вызванная с использованием ключевого слова new
, возвращает нам объект, а сама становится конструктором данного объекта:
Поведение функции User()
при использовании new
слегка изменится:
Данная конструкция создаст новый, пустой объект
Ключевое слово
this
получит ссылку на этот объектФункция выполнится и, возможно, изменит объект через
this
(как в примере выше)Функция вернёт
this
(по умолчанию)
Результатом выполнения кода будет следующий объект:
В стандарте ES6(ES2015) появилась конструкция class
, что по сути — синтаксический сахар для JavaScript — специально для тех, кто не любит работать с прототипами (ага, для таких как я).
Если переписать код выше на классы, то получим следующий результат:
Опять отправлю читать учебник по JavaScript :)
Простая задачка для закрепления материала:
Напишите класс для кота, и чтобы мы могли узнать какой он породы, и какого цвета.
Область видимости и this
this
Для тех, кто только начинает своё знакомство с JavaScript я расскажу следующие нюансы:
когда вы объявляете переменную или функцию, то она становится частью «window»:
когда искомая переменная не найдена в текущей области видимости, её поиски будут продолжены в области видимости родительской функции:
чудо-переменная
this
всегда указывает на текущий объект, вызывающий функцию (поскольку по умолчанию все переменные и функции попадают в «window», то «this == window»):
Всё, что касается «window», относится лишь к браузерам, хотя поскольку книга о jQuery, то иное поведение я и не рассматриваю, но вот так прозрачно намекаю, что есть альтернативная реальность со своим «jQuery», и звать её там cheerio ;).
Замыкания
Изучив замыкания, можно понять много магии в JavaScript. Приведу пример кода с пояснениями:
Что же тут происходит? Функция, объявленная внутри другой функции, имеет доступ к переменным родительской функции. Повтыкайте в код, пока вас не осенит, о чём я тут толкую.
Хорошая задачка, которая в полной мере даёт понимание сути проблемы: «Армия функций»
Рекомендуемые статьи по теме:
Вводная по JavaScript затянулась, лучше не поленитесь, и изучите весь учебник от Ильи Кантора.
Last updated