Java development 2.0: Вторая волна разработки Java-приложений: JavaScript для разработчиков Java

Пособие для начинающих разработчиков Java по переменным, типам, функциям и многим другим аспектам JavaScript

Программисты, пишущие на языке Java™, традиционно не слишком серьезно воспринимают JavaScript, поскольку он слишком легковесен для серьезного программирования и слишком громоздок для применения в качестве альтернативного языка для написания скриптов. И все же JavaScript имеет право на существование и лежит в основе таких удивительных Web-технологий, как GWT и Node.js. В этом выпуске Java development 2.0 Эндрю Гловер объясняет, почему JavaScript является важным инструментом современного Java-разработчика. Затем он знакомит вас с синтаксисом, необходимым для построения первоклассных приложений для современного Интернета, включая переменные, типы, функции и классы JavaScript.

Эндрю Гловер, президент компании, Stelligent Incorporated

Эндрю ГловерЭндрю Гловер является президентом компании Stelligent Incorporated , которая помогает другим фирмам решать проблемы качества программного обеспечения. Для этого используются эффективные стратегии тестирования и технологии непрерывной интеграции, которые позволяют коллективам разработчиков постоянно контролировать качество кода, начиная с ранних стадий разработки. Просмотрите блог Энди , там можно найти список его публикаций.



04.07.2012

В первые годы существования платформы Java многие журналисты и даже некоторые начинающие программисты зачастую путали JavaScript и язык Java. Оба языка были популярны из-за их применимости к Web-программированию, и в течение нескольких лет общественное мнение приравнивало их друг к другу. Сегодня большинство людей различают эти языки, но среди разработчиков Java до сих пор принято считать JavaScript несерьезным языком, не пригодным даже для написания скриптов. Тем не менее JavaScript (как и Java) живет и даже развивается. Он используется для написания программ, работающих на стороне клиента, как в Ajax, и работающих на стороне сервера, как в Node.js, а его возможности для разработки мобильных приложений только начинают раскрываться. Кроме того, именно в этот язык компилируются программы на языке Java в очень популярных пакетах Google Web Toolkit (или GWT).

В этом выпуске Java development 2.0 я объясняю важность JavaScript для современных Java-разработчиков и рассматриваю некоторые наиболее полезные синтаксические структуры JavaScript, поясняя их отличие от языка Java и сравнивая их с более современными динамическими языками вроде Groovy и Ruby.

Об этой серии

С момента первого появления технологии Java™ принципы разработки ПО на этом языке претерпели значительные изменения. Благодаря появлению мощных систем с открытым исходным кодом и надежных инфраструктур для предоставления средств разработки в аренду стало возможным быстро и дешево транслировать, тестировать, исполнять и поддерживать приложения Java. В данной серии статей, Эндрю Гловер описывает широкий спектр средств и технологий, благодаря которым стала возможной эта новая парадигма разработки на языке Java.

Вчера и сегодня: чем важен JavaScript

Язык JavaScript был впервые представлен компанией Netscape в 1995 году и быстро приобрел популярность. В значительной степени это было связано с тем, что Интернет начал приобретать статус коммерческой информационной платформы: JavaScript позволял и до сих пор позволяет программно влиять на поведение Web-страницы в браузере. По тем временам это было очень эффектно. Тогда эти возможности использовались для проверки HTML-форм и небольших трюков с изображениями.

С тех пор JavaScript претерпел несколько перевоплощений. Одно время компания Netscape выпускала продукт Netscape Application Server, который использовал JavaScript на серверной стороне для построения Web-приложений. Спустя несколько лет поднялась новая волна интереса к JavaScript благодаря созданию Ajax и библиотек виджетов, подобных Prototype, JQuery и Extjs. И уже недавно JavaScript завершил этот круг на стороне сервера, придя к Node.js — основанной на событиях системе ввода/вывода, предназначенной для построения Web-приложений на движке JavaScript V8 от Google.

В свое время компания Netscape проявила завидную предусмотрительность, передав JavaScript в Ecma International для стандартизации. Именно поэтому некоторые называют его ECMAScript. И, что более важно, именно поэтому большинство Web-браузеров поддерживает ECMAScript. В результате Web-приложения иногда просто вынуждены использовать JavaScript, и эта ситуация вряд ли изменится, поскольку в настоящее время другого совместимого с браузерами языка сценариев на горизонте не наблюдается.

Node.js

Node.js (см. Ресурсы) представляет собой работающую на стороне сервера, основанную на событиях систему, обладающую высокой степенью параллельного исполнения. Программы Node.js масштабируются значительно эффективней программ с потоками и в то же время свободны от многих проблем, связанных с параллельным программированием. И хотя Node.js появился сравнительно недавно, его инновационный потенциал будоражит воображение. А ключом к растущему семейству инструментов Node.js является знание JavaScript.

Сегодня, несмотря на сложившуюся неважную репутацию, JavaScript является, пожалуй, самым распространенным (и удобным) языком на планете. Если вы пишете на Java (или на Ruby, Python или PHP), то, вероятнее всего, вы уже использовали JavaScript или воспользуетесь им в ближайшем будущем. Понимание некоторых возможностей JavaScript поможет вам создавать новые сверхпопулярные Web-приложения. Кроме того, оно позволит воспользоваться преимуществами Node.js и даже лучше понять то, что происходит под капотом у GWT.

В следующих разделах я опишу основные элементы синтаксиса JavaScript, уделив внимание ошибкам и приемам, которые могут особенно удивить или порадовать разработчиков на Java. Но сначала я хочу развеять один из наиболее устойчивых мифов о JavaScript: что для взаимодействия с ним вам нужна Web-страница.


Применение JavaScript в Chrome

Исторически сложилось так, что для работы JavaScript нужен был браузер и, косвенным образом, Web-страница. Некоторые разработчики считают это неудобством и даже серьезным препятствием. К счастью, браузеры не стоят на месте; сегодня и Firefox, и Chrome предоставляют интегрированные среды разработки для исполнения JavaScript.

Для экспериментов с этим языком я люблю пользоваться удобной консолью JavaScript в Chrome. Подобно Ruby IRB или оболочке Python, Chrome предоставляет интерактивную среду для исследования JavaScript без Web-страницы.

CoffeeScript

Если вам нравятся возможности JavaScript, но не нравится его синтаксис, взгляните на CoffeeScript. CoffeeScript — это "небольшой язык, который компилируется в JavaScript"; другими словами, CoffeeScript упрощает программирование на JavaScript, ослабляя некоторые синтаксические правила. Во многом CoffeeScript больше похож на Ruby или Python, но полностью эквивалентен JavaScript. Чтобы узнать больше о CoffeeScript, посетите раздел Ресурсы.

Чтобы начать работу с консолью JavaScript в Chrome, загрузите Chrome для своей ОС. Затем откройте новую пустую (т.е. не указывающую на Web-страницу) вкладку и выберите Настройки и управление > Инструменты > Консоль JavaScript. В нижней части окна Chrome появится консоль разработчика JavaScript. Это окно можно сделать автономным, нажав на значок Undock (Отстыковать) в нижнем левом углу консоли. Теперь вы можете выбрать значок консоли в верхнем правом углу окна и получить простое пустое окно для взаимодействия с JavaScript, как показано на рисунке 1:

Рисунок 1. Работа с JavaScript в Google Chrome
A screenshot showing Google Chrome's JavaScript console

Теперь давайте взглянем на синтаксис.


Переменные JavaScript

JavaScript — довольно простой язык в том смысле, что он позволяет сделать довольно много ошибок и при этом все-таки получить работающую Web-страницу. Сбои элементов JavaScript часто проходят незаметно, что, в общем, можно считать за плюс. Ранний Интернет был бы неуютным местом, если бы кривые программы на JavaScript не давали загружаться Web-страницам. С другой стороны, если применять JavaScript для более тонких вещей (типа асинхронного обновления состояния страницы), то небрежное написание скриптов обязательно даст о себе знать. Поэтому разработчикам на Java следует потратить время на глубокое понимание ряда аспектов синтаксиса JavaScript.

Особенно важно понять принципы работы с переменными в JavaScript. Например, переменную с именем foo можно определить либо непосредственно, либо через объявление var, как показано в листинге 1:

Листинг 1. Переменная foo
foo = 'foo'
var bar = 'bar'

Переменная foo в листинге 1 является допустимой переменной JavaScript. Но, поскольку для нее не использовалось объявление var, она является глобальной переменной. Переменные, объявленные через var, имеют ограниченную область действия (например, в пределах функции, в которой они объявлены).

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


Примитивные типы и объекты

Хотя язык JavaScript можно назвать каким угодно, но только не примитивным, в том, что касается типов, он весьма прост. На самом деле JavaScript имеет всего четыре базовых типа, и три из них — примитивные. К примитивным типам JavaScript относятся Number, String и Boolean. Работу этих типов можно продемонстрировать с помощью удобного оператора typeof.

Давайте сделаем это вместе. В консоли JavaScript браузера Chrome введите текст, приведенный в листинге 2:

Листинг 2. Активация типов
var string = "test"
typeof string

Вы увидите, что в консоли будет выведено значение "string". Следует также отметить, что применение точки с запятой в JavaScript не обязательно. Как и в большинстве популярных языков, значение типа string заключается в кавычки; соответственно числа представляются просто числами. Булевы переменные представляются значениями true или false без кавычек.

Листинг 3. Логические значения и числа в JavaScript
var aNumber = 10
var anotherNumber = 0.99
var aBool = true
var notABoolean = "false"

Вы можете заметить, что JavaScript не различает числовых типов; числа — это просто числа в разных форматах.

Кроме того, JavaScript поддерживает общие объекты, которые сами по себе имеют типы экземпляра, такие как Array, как показано в листинге 4:

Листинг 4. Экземпляр массива
> var myArray = ["Привет", 1, true]
> typeof myArray
"object"
> myArray instanceof Array
true

Массивы (array) в JavaScript больше похожи на списки других языков: их можно создавать без указания размера, и они могут содержать все, что вам заблагорассудится туда положить. Как в Ruby или Groovy, массивы JavaScript можно создавать с помощью синтаксической конструкции []. К тому же массивы JavaScript поддерживают методы (как показано в листинге 5), подобные тем, которые других языках поддерживают списки:

Листинг 5. Методы массивов
> var myArray = ["Привет", 1, true]
> myArray[0]
"Привет"
> myArray.length
3
> myArray.pop()
true
> myArray
["Привет", 1]
> myArray.pop()
1
> myArray
["Привет"]
> myArray.push("вставлен")
2
> myArray
["Привет", "вставлен"]

К значениям массива можно обращаться по номерам позиций, отсчет которых начинается с нуля. Массивы реагируют на команды push и pop, причем push добавляет элемент в массив (в последнюю его точку), а pop удаляет элемент (подобно стеку, из последней позиции).

Кроме того, массивы поддерживают циклический перебор, как показано в листинге 6:

Листинг 6. Циклический перебор массива
> var myArray = [1,2]
> for(var i = 0; i < myArray.length; i++) { console.log(myArray[i]) }
1
2

Приведение типов

JavaScript не просто язык со слабой типизацией, — в нем она даже слабее, чем в Ruby или Groovy! JavaScript всеми силами старается привести объекты к тому типу, который имеет смысл в данном месте кода. Это имеет смысл в том контексте, для которого изначально предназначался JavaScript: взаимодействие с Web-страницами. Небрежно написанная программа на JavaScript не должна мешать пользователю читать онлайновую статью!

Приведение типов свойственно не только JavaScript, но вариант, используемый в JavaScript, отличается гибкостью. Хорошо это или плохо, зависит от вашей точки зрения. Нестрогость JavaScript может скрыть дефекты, примерно так, как это делают глобальные переменные.

Например, можно определить массив и потом по неосторожности попробовать выполнить с ним какую-нибудь числовую операцию или даже строковую конкатенацию, как показано в листинге 7:

Листинг 7. Гибкость типов в JavaScript
> var myArray = [1,2]
> console.log(2 * myArray)
> console.log("A" + myArray)

В этом случае первое сообщение напечатает текст NaN, а второе напечатает A1,2. В обоих случаях код "работает" и ничего не ломается — JavaScript продолжает работать. Здесь нестрогость типов проявляется во всей красе. Аналогичный код на Ruby будет работать совсем по-другому, как показано в листинге 8:

Листинг 8. Ruby работает по-другому
> array = ["A", "B"]
> ans = 2 * array

Код на Ruby в листинге 8 прекратит работу с сообщением об ошибке:

TypeError: Array
can't be coerced into Fixnum (невозможно привести к типу Fixnum)

А если попытаться добавить к массиву "A", то получится вот что:

TypeError: can't convert(невозможно преобразовать)
Array into String(массив в строку)

Если проделать это же в Groovy, то получится нечто вроде следующего:

groovy.lang.MissingMethodException: No signature of method: (сигнатура метода)
java.lang.Integer.plus() is applicable for argument types:
(не применима для типов аргумента)  (java.util.ArrayList) values:(значений)
[[A, B]]

Таким образом, вы видите разные уровни нестрогости типов в действии. Ясно, что если бы существовал конкурс на нестрогость, то JavaScript вышел бы в нем победителем!


Функции JavaScript

Функция JavaScript, подобно методу Java, представляет собой конструкцию, определяющую и инкапсулирующую многократно используемое поведение. На первый взгляд функции JavaScript очень похожи на замыкания Groovy. Функции в JavaScript являются объектами. На самом деле они являются объектами первого класса, что очень непохоже на методы Java. И, поскольку функции JavaScript являются объектами, их можно передавать в качестве аргументов другим функциям и использовать на ваше усмотрение.

Функции определяются с помощью ключевого слова function. Вы можете определить аргументы подобно тому, как это делается при объявлении метода на языке Java, плюс функция JavaScript может возвращать некоторое значение. В отличие от динамических языков, таких как Groovy или Ruby, где вызов возврата является необязательным (и в этом случае возвращается последняя строка любого метода), функции в JavaScript обязательно должны использовать инструкцию возврата, если хотят вернуть какое-нибудь значение; иначе они не возвратят ничего.

Функции в JavaScript вызываются примерно так, как вызываются замыкания в Groovy. В листинге 9 я определил простую функцию без параметров. Ее назначение — напечатать "blah" в консоли JavaScript браузера Chrome.

Листинг 9. Объявление и вызов функции в JavaScript
> function blah() { console.log("blah"); }
> blah() //печатает blah
> blah.call() // печатает blah
> blah.apply() // печатает blah

Функцию можно вызвать просто со скобками (то есть ()), через метод call или через метод apply. Это четко демонстрирует первоклассность объектов функции. Листинг 10 показывает, что произойдет, если вызвать несуществующий метод функции blah:

Листинг 10. Функции как объекты языка JavaScript
> blah.foo()

В этом случае вы увидите сообщение об ошибке, жалующееся на то, что метод foo не определен. Выглядит это примерно так:

TypeError: Object function blah() { console.log("blah"); } has no method 'foo'
(Объект функции blah() не имеет метода 'foo')

Теперь прочтите это сообщение об ошибке еще раз. Оно жалуется на то, что метод foo не определен, а это подразумевает, что если бы он был определен, то все бы работало.


Классы в JavaScript

JavaScript поддерживает примитивные типы, о которых я уже говорил. Кроме того, он поддерживает объекты, подобные массивам. JavaScript не поддерживает классы — по крайней мере в традиционном для Java понимании. Поскольку JavaScript является языком, основанным на прототипах, в нем не применяется определение классов; вместо этого для многократного использования поведения применяется клонирование существующих объектов. Таким образом, в JavaScript вы не определяете объекты класса, вы определяете их в функциях и затем используете вложенные функции для определения поведения — то, что вы уже видели в действии.

Для имитации класса определяется функция. Ей можно дать имя (т.е. имя класса), указать параметры (как в конструкторе) и затем даже применить ключевое слово .this, которое означает ссылку на переменную в области действия функции. И более того, внутренним функциям можно назначать псевдонимы, чтобы все выглядело как вызов метода.

Чтобы продемонстрировать вышесказанное, я создал в листинге 11 простейший прототип Message (известный также как класс). Я предоставлю несколько параметров (от кого сообщение, кому оно направлено, само сообщение), и этот класс представит мое сообщение в виде JSON.

Листинг 11. Функции как классы в JavaScript
function Message(to, from, msg){
 this.to = to;
 this.from = from;
 this.msg = msg;

 this.asJSON = function(){
  return "{'кому':'" + this.to + "', 'от':'" + this.from + "', 'сообщение':'" +
    this.msg + "'}";
 }
}

В листинге 11, я определил функцию Message— объект с именем и несколькими свойствами; а именно to (кому), from (от кого) и msg (сообщение). Затем я определил свойство (asJSON), указывающее на внутреннюю функцию, цель которой — создать строку, представляющую мое сообщение в формате JSON.

Заметьте, что я могу определить этот "класс" на Web-странице, загрузить его в Chrome, открыть консоль JavaScript и использовать его интерактивно. Именно это и происходит в листинге 12:

Листинг 12. Использование классов в JavaScript
> var message = new Message('Энди', 'Джо', 'Сегодня вечеринка!');
> message.asJSON();
"{'кому':'Энди', 'от':'Джо', 'сообщение':'Сегодня вечеринка!'}"

Этот код очень похож на код Groovy и даже на код Java (если бы не var), не так ли? На самом деле для написания приложений JavaScript (т.е. программ, содержащих объекты с данными и методы, взаимодействующие друг с другом) вполне можно использовать методы объектно-ориентированного программирования.


Заключение

Надеюсь, эта статья развеет давно устаревшее представление о JavaScript как о несерьезном языке. На самом деле это достаточно мощный язык, обладающий многими синтаксическими достоинствами и простотой, свойственными более новым языкам, таким как Groovy и Ruby. Те свойства JavaScript, которые в 90-х заставляли в нем сомневаться, сегодня уже считаются преимуществами.

Учитывая важность Интернета для развития Java-приложений и уникальное место, занимаемое JavaScript в качестве совместимого с браузерами языка, каждый пишущий на Java программист безусловно должен знать JavaScript. Браузер (на компьютере или мобильном устройстве, в телефоне или планшете) являет собой средство, с помощью которого все больше и больше людей взаимодействуют со своими приложениями. JavaScript также является общей средой взаимодействия между всеми языками, работающими на стороне сервера. Кроме того, понимание некоторых возможностей JavaScript поможет вам лучше программировать на любом языке, включая тот, который вы считаете родным.

Ресурсы

Научиться

  • Оригинал статьи: Java development 2.0: JavaScript for Java developers.
  • Серия статей Java development 2.0: посвящена технологиям, меняющим принципы разработки на языке Java. Среди рассматриваемых тем —Google App Engine (август 2009 г.), NoSQL (май 2010 г.) и Amazon Elastic Beanstalk (февраль 2011 г.).
  • Почему надо знать JavaScript (Михаил Волошинович (Michael Woloszynowicz), Web-разработка 2.0 и уроки бизнеса, январь 2011 г.): разработчики, имеющие богатый опыт программирования на Java, переносят важные приемы в JavaScript, а JavaScript предоставляет важные средства для создания мобильных и Web-приложений.
  • JavaScript как цель компиляции: Clamato, GWT Smalltalk, Python, Scheme (Вернер Шустер (Werner Schuster), InfoQ, сентябрь 2009 г.): обзор новейших средств, которые изменили способ применения JavaScript, используя его для разработки мобильных и Web-приложений.
  • Почему нужно обратить внимание на Node.js (Стивен О’Грэди (Stephen O'Grady), RedMonk Tecosystems, май 2010 г.): обсуждение Node.js как передовой технологии параллельного программирования.
  • Сравнение инфраструктур JavaScript (Джо Леннон (Joe Lennon), developerWorks, февраль 2010 г.): в этой статье важно не только сравнение, но и подробное обсуждение возможностей, максимально повышающих удобство JavaScript, включая селекторы, обход DOM и обработку событий.
  • GWT fu, Часть 1 (Дэвид Гири (David Geary), developerWorks, сентябрь 2009 г.): узнайте, как GWT компилирует код Java в JavaScript, создавая более насыщенный интерфейс пользователя, чем в браузере.
  • Что такое Node.js? (Майкл Абернети (Michael Abernethy), developerWorks, апрель 2011 г.): Майкл Абернети дает хороший обзор возможностей Node и его текущих ограничений.
  • Применение Node.js в качестве полностью облачной среды разработки (Ной Гифт (Noah Gift) и Джереми Джонс (Jeremy Jones), developerWorks, апрель 2011 г.): обсуждение параллельной модели, использующей асинхронный ввод/вывод через обратные вызовы, и построение чат-сервера.

Получить продукты и технологии

  • Скачайте Google Chrome— один из лучших инструментов для взаимодействия с JavaScript без Web-страницы.
  • Стандарт ECMA-262: спецификация ECMAScript.
  • Node.js: система ввода/вывода событий, построенная на движке JavaScript V8 компании Google .

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java, Open source
ArticleID=824133
ArticleTitle=Java development 2.0: Вторая волна разработки Java-приложений: JavaScript для разработчиков Java
publish-date=07042012