Немного о 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.
Да, да, 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 не было констант, но поскольку необходимость в них всё же была и до того, то была негласная договоренность: переменные, набранные в верхнем регистре через подчёркивание, не изменять:
Если же говорить об эре 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»; как обойти такую «неприятность», я ещё расскажу.
Посмотрите внимательно на код, и скажите - каков будет результат вычисления:
Массивы
Массив — это коллекция данных с числовыми индексами. Данные могут быть любого типа, в качестве примера я приведу один из самых простых вариантов — массив со строками:
Нумерация массивов начинается с «0», так что для получения первого элемента вам потребуется следующий код:
Размер массива хранится в свойстве length:
Для перебора массива лучше всего использовать цикл for(;;):
На предыдущем примере цикл покажет четыре значения undefined, что может вызвать проблемы, и только затем будет работать со значением 10. Иначе действует похожий, но не равнозначный цикл for (in) (он сразу возьмётся за значение 10). Пример цикла:
Для работы с последним элементом массива следует использовать методы push() и pop():
Для работы с первым элементом массива следует использовать методы unshift() и shift():
Последние два метода работают медленно, т.к. перестраивают весь массив пошагово.
Упражнение для закрепления материала:
как мне получить пользователя по имени
Andreyиз массиваusers?какова длина массива?
Функции
С функциями в JavaScript всё просто, вот вам элементарный пример:
Просто, пока не заговорить об анонимных функциях…
Анонимные функции
В JavaScript можно создать анонимную функцию (т.е. функцию без имени), для этого достаточно слегка изменить предыдущую конструкцию:
Так как функция — это вполне себе объект, то её можно присвоить переменной, и (или) передать в качестве параметра в другую функцию:
Анонимную функцию можно создать и тут же вызвать с необходимыми параметрами:
Это несложно, скоро вы к ним привыкнете, и вам их будет недоставать в других языках.
Стрелочные функции
Ах, этот ES6 – он принёс ещё более краткую форму для создания функций, это так называемые «функции-стрелки»:
Данная запись конечно же, удобная, но не стоит увлекаться, так как если перестараться, то ваш код станет нечитаем, и по итогу вы можете услышать много нелестных выражений в свой адрес.
Решите простую 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