Рекомендую провести эксперимент. Подойдите к группе программистов и шепотом скажите: «javascript». Разговор тут же перейдет в бурную фазу дебатов, и любая тема, которая обсуждалась ранее, будет напрочь забыта (если конечно они не были заняты забиванием гвоздей в гроб PHP). Почему это тема столь живая? И как у JS получается вызывать столько шума?
Чтобы разобраться в этом, стоит окунуться в историю. JS изначально создавался как скриптовый язык программирования. Где-то в 2004 году на него не было возложено много ответственности. Его обыденными задачами были: красивая замена цветов, обслуживание выпадающих окон и шокирование пользователей магией модальных окон.
Шло время. JS пережил несколько важных преобразований. Теперь JavaScript — полноценный язык программирования и на бэке, и на фронте. Он постепенно захватывает мобильную разработку и уже захватил браузерные игры, 3d графику (Выпьем за flesh, не чокаясь).
Однако архитектура языка, решения и «идея» были заточены под его первоначальные задачи. Таким образом мы получаем интересные особенности (именно особенности, так как сложно назвать это плюсами или минусами). Пройдемся по ним и поймем, как с этим жить.
Неявные преобразования
Под «неявными» в данном контексте стоит понимать преобразования, которые делает сам язык, а не вы. В случае с JS они действительно бывают максимально неявными.
Думаю, что такие примеры, как "5«+4, уже не удивят изысканный вкус читателя. Больше всего в этой особенности js мне нравится (‘b’+’a’+ +’b’).toLowerCase() Крайне рекомендую попробовать.
Как же научиться предугадывать эти неявные преобразования? На самом деле JS пытается сделать минимальное количество преобразований, которые у него с максимальной вероятностью получатся.
Если рассматривать на примере ‘5’+4, то в этом случае может быть либо сложение чисел, либо конкатенация (склеивание) строк. Так как мы можем любое число преобразовать к строке (обратное утверждение ложно), то из этих двух операций выбирается конкатенация, число приводится к строке, и значения склеиваются.
Интересная статейка, рекомендую:
https://habr.com/ru/company/ruvds/blog/347866/
Объекты в JS
Объекты в JS вовсе объединили в себе две темы: ассоциативный массив и ООП.
Если с ООП всё приблизительно как в других языках, то с ассоциативными массивами бывают сложности. В JS объекты — это и ассоциативный массив, и объект. Мы можем итерироваться по ключу и присваивать методы, которые ссылаются на внутренние свойства. Это слияние приводит к путанице в понимании и так непростой сущности — this. Если изучая, JS вы поняли this, я вас поздравляю! Вы большая умница. :) This определяет контекст выполнения метода. И если в других языках подобие this используется только в классах, то в JS это зло вышло на улицы.
Однопоточность
Внимание! JS — это однопоточный язык! Он не способен на множество действий одновременно. «Минуточку! Я знаю, что в JS есть асинхронные процессы! Как же они работают в однопоточном языке?» — спросите вы. А никак! Асинхронные запросы реализуются на стороне браузера, если это JS на стороне клиента, и в NodeJs, если это сервер. В самом JS нет асинхронности — живите теперь с этим. На практике это обходится, как я уже сказал: либо через браузер, либо через Node.
Отличное видео про асинхронность в JS:
https://www.youtube.com/watch?v=8cV4ZvHXQL4
Так почему у некоторых программистов от слов ES6 сердце начинает биться немного чаще?
- JS — единственный язык, на котором можно сделать все, от слова совсем. Хорошо изучив этот язык, вы можете: написать сайт (полностью), разработать мобильное приложение, игры, написать что-нибудь на десктоп и даже программировать микроконтроллеры. Это тот самый случай, когда выучив один язык, можно легко переходить из одной технологии в другую.
- У JS пожалуй оно самое разноплановое и обширное комьюнити. Я думаю, вы согласитесь с тем, что язык учить проще, когда в интернете есть тонны литературы и ответов на вопросы. Ещё не было такого случая, когда я не смог найти ответ на свой вопрос по JS в интернете.
- JS полезен в быту. Нередко я решаю не связанные с работой задачи с помощью JS. Можно легко распарсить нужный материал с сайта, убрать надоедливую рекламу (если кто-то вспомнил Adblock, у меня плохие новости — почитайте про теневой DOM), скачать видео или сделать кино на весь экран. Вроде мелочи, а приятно.
Всё, сказанное ранее, можно отнести к особенностям JS. Да, пускай они сильно отличаются от реализации в других языках, но, хорошо понимая эти фичи, вы сможете не только виртуозно обходить эту жесть, но и использовать ее себе во благо. Например, писать более изящный и понятный код.
Учите JS, друзья, и не пугайтесь его неочевидности!
PS. Воспользуйтесь возможностью получить знания и навыки работы с JS от действующих разработчиков на интенсиве по веб-разработке в HackerU.