Почему я люблю и ненавижу JavaScript

ноября 29, 2011  |  Published in ClientSide, JavaScript  |  12 Comments

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

1. Мне очень не нравится зависимость JavaScript от окружения. Это не есть недостатком самого языка, но есть большим недостатком технологии. Вместо того, чтобы писать код, программист вынужден бороздить просторы интернета в поисках документации о различиях браузеров и решении возникающих из этого проблем. Часто разработчики пишут код под какой-то один браузер (javascript движок), например под FireFox, а затем тестируют и допиливают его для работы в остальных браузерах. К счастью имеюттся различные фреймворки вроде jQuery, которые решают многие проблемы с кроссбраузерностью.

2. Изначально JavaScript (он же Mocha, он же LiveScript, он же JScript, он же ECMAScript) писался в попыхах, но уже прошло много времени, а недостатков у JavaScript практически не убывает.

Кто-нибудь знает зачем необходим оператор typeof?

var array = [1,2,3];
var hash = {a : 1, b : 2};
var str = new String("String");

alert(typeof(array)); //object
alert(typeof(hash)); //object
alert(typeof("string")); //string
alert(typeof(str)); //object
alert(typeof(NaN)); //object
alert(typepf(null)); //number

А вот еще интересный пример:

alert(NaN == NaN); //false

В JavaScript скрыто очень много неочевидных моментов, которые мешают состоянию потока мысли и заставляют программиста, особенно новичка каждые 10-20 минут заниматься гуглением вместо написания кода.

Или вот:

alert(20 == "0020"); //true

Здесь конечно можно сказать, что программист должен был прочитать хотя бы «JavaScript за 10 минут на урок» чтобы знать, что нужно использовать следующий оператор === (в отличие от большинства языков программирования оператор == в JavaScript выполняет приведение типов, а вот === сравнивает объекты как есть).

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

3. Двойственные чувства вызывает наследование основанное на прототипах. С одной стороны оно более гибкое, чем классическое наследование классов и может  использоваться для эмулирования классов (функции — конструкторы), но с другой стороны многие JavaScript ниндзи признают, что конструкторы не всегда верны и необходимо использовать сторонние библиотеки, фреймворки или писать свой велосипед реализующий классы.

Хотя наследование на прототипах интересно и забавно, часто хочется писать более очевидный код, а не решать кроссворды.

4. У JavaScript не очень профессиональное сообщество, но хорошо, что многие люди из Ruby тусовки вместе с Ruby активно программируют на JavaScript. CoffeeScript, Jasmin, SproutCore, Prototype, Spine.js и т.д. — все эти средства пришли в JavaScript от Ruby сообщества. Сейчас JavaScript сообщество активно увлечено разработкой серверной версии JS работающей на V8, например Node.js. Это не самое лучшее начинание, мое мнение заключается в том, что JavaScript’у место в браузере, для серверного кода имеется Ruby, Python и само говнейшество — PHP. Единственное преимущество серверного JavaScript перед Ruby — это его скорость выполнения, которая обеспечивается тем, что сам JavaScript более простой и примитивный язык программирования чем Ruby и темб что V8 занимается прекомпиляцией Javascript в машинный код. Кроме этого преимущества у JavaScript в сравнении с Ruby имеются только недостатки. Хороших книг по JavaScript не существует. 99% того, что есть — это тупое описание языка.

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

function aPlusB(a, b) {
  a = a == null ? 2 : a;
  b = b == null ? 3 : b;
  alert(a+b);
}

6. Мне очень нравится гибкость в JavaScript, наличие множества паттернов программирования и множества техник и путей решения поставленной задачи. Своей гибкостью JavaScript код сложен для поддержания, но разработка доставляет удовольствие если использовать фреймворки.

7. Отличной фишкой в JavaScript является наличие множества активно развивающихся фреймворков и библиотек! По сути 60-70% из нескольких десятков фреймворком используют JavaScript, но наличие выбора всегда радует. Помимо замечательного в своей простоте и функциональности jQuery у JavaScript в рукаве спрятано еще мно-чего, фактически обладая отличным Google-fu можно находить плагины к JQuery и библиотеки, которые позволят вам писать очень маль кода. У JavaScript также имеется множество очень мощных библииотек для организации структуры кода, напимер Backbone.js, Spine.js и другие. Они навязывают разработчику правильную архитектуру организации кода и стиль. Также имеется несколько мощных фреймворком для разработки RIA, например ExtJS, woohoo, SproutCore.

8. У JavaScript несколько избыточный синтаксис и много простейших вещей не реализовано в языке и их приходится делать самостоятельно, однако имеется альтернатива в лице CoffeeScript. CoffeeScript — это подслащенный JavaScript. CoffeeScript компилируется в JavaScript при этом компилируется в очень хороший JavaScript. CoffeeScript разрабатывался под вдохновлением в первую очередь от Ruby, а во вторую от Python, убрал из JavaScript излишества и добавил из этих двух языков некоторые фишки, которых сильно не хватало.

Итог
Несмотря на то, что JavaScript не самый крассивый и удобный язык его изучать все-таки необходимо если вы хотите стать веб-разработчиком. Выучив JavaScript вам необходимо обязательно обратить внимание на CoffeeScript — он позволит вам убивать меньше нервных клеток и увеличит производительность вашего трада и удоовольствие от написания кода. Вам также следует использовать фреймворк jQuery. Возможно jQuery не самый лучший фреймворк на JavaScript, хотя мне он кажется именно таким, но у него очень много приверженцев, очень много документации и плагинов. Фактически без фреймворков мало кто что-то пишет (я говорю о коде приложений, а не о библиотеках), так что jQuery — это самое то. При разработке приложений с более-менее сложным Client-Side кодом вам следует обратить внимание на Backbone.js или Spine.js. Если вы разрабатываете RIA и ваше веб приложение должно выглядеть как десктопное, то обратите внимание на ExtJS, SproutСore и другие библиотеки. Мощный и богатый инструментарий — это одиин из наибольших плюсов JavaScript и один из основных факторов, почему JavaScript будет существовать очень долго, а Dart сразу после релиза поутих.

Responses

  1. tankard says:

    ноября 29, 2011 at 11:23 (#)

    Даешь Coffeescript в массы!))

  2. faustman says:

    ноября 29, 2011 at 12:19 (#)

    CoffeeScript + Backbone.js — жгучая смесь ))

    Да и с рельсами это добро дружит отлично.

  3. Федор says:

    ноября 29, 2011 at 12:47 (#)

    JavaScript должен умереть!

    Даешь руби в браузере!

  4. says:

    ноября 29, 2011 at 17:46 (#)

    typeof применяется для того, чтобы узнать объявлена переменная или нет, например:

    if (typeof speed === "undefined" || speed === null) speed = 75;
    

    Аргументы по умолчанию объявляются так:

    function aPlusB(a, b) {
      a = a || 2;
      b = b || 3;
      alert(a+b);
    }
    

    При взгляде на такую функцию не всегда поймёшь, какие у неё аргументы по умолчанию, что является большим минусом.

  5. ATimofeev says:

    ноября 30, 2011 at 04:09 (#)

    Про отсутствие хороших книг не соглашусь — есть отличный труд Джона Рейсига, создателя jQuery, в которм тупого описания языка процентов десять, а весь остальной материал посвящен решению различных кейсов.

  6. admin says:

    ноября 30, 2011 at 08:05 (#)

    ATimofeev, я и не отрицал существование хороших книг по JavaScript, просто их мало. Рейсиг, Крокфорд, возможно, Флэнаген, но тут опять-таки перепечатка спецификации языка и еще Marijn Haverbeke — его Eloquent JavaScript хороший труд. Больше никого не назовешь. В то же время по Ruby даже не смотря на то, что платформа менее популярна,имеется гораздо большее количество интересных книг и не только по самому Ruby и Rails, но и по различным хорошим практикам.

  7. tankard says:

    ноября 30, 2011 at 08:54 (#)

    Только по руби книги очень быстро устаревают. И не все из них обновляют. Обновляют только самые популярные.

  8. tankard says:

    декабря 1, 2011 at 08:17 (#)

    Сейчас смотрю документацию Dart. А ниче так язык. Мне нравится больше javascript, но меньше coffeescript.Но Dart еще очень сырой. Интересно получтся ли у гугла продвинуть его или нет.

  9. says:

    декабря 1, 2011 at 12:20 (#)

    Очень интересная статья получилась, хотя я тока-тока начал ruby on rails изучать. Спасибо большое.

  10. weiss says:

    декабря 2, 2011 at 19:01 (#)

    JS typeof это случайно не аналог «instance_of?»? Тогда нет ничего странного в этом операторе.

  11. Redbrain says:

    марта 24, 2012 at 10:59 (#)

    улыбнула статья, могу сказать только, что очень много воды, а то и вообще полного бреда, откровенно говоря сложилось впечатления, что статья написана человеком не разбирающемся в программировании

  12. admin says:

    марта 27, 2012 at 17:01 (#)

    Redbrain, ну хоть повеселил, и то хорошо.

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.