Как стать автором
Обновить

Комментарии 100

Хороший обзор, только вот JS уже давно поддерживает ООП, не так ли? Классы работают во всех современных браузерах.

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

Для тех, кто хочет возразить, сначала посмотрите на статистику вашего веб приложения / сайта и убедитесь, что просмотры с IE не равны 0.
И? Это не полноценный ООП, ненастоящий и вообще сахар. Публичные поля доступны лишь в предыдущем 72 хроме, приватные вообще нигде.
Вы хотели сказать «это не такое ООП, к которому я привык»?
я-то как раз привык к такому, но это не меняет сути
В проектах, где нужны public, private, protected, код пишут на TypeScript, который автоматически компилится в JS.

yarn add typescript

Проблема решается за 10 секунд
ага, который работает только в девелопе. Оно, конечно, сильно помогает, но очередной костыль который приходится ставить. Ещё и приходится выбирать (а от места работы и адаптироваться), к PropTypes\Flow\TS\еще_какая_ересь
НЛО прилетело и опубликовало эту надпись здесь
Сложное ООП(условные приватные поля) это в 95% случаев просто меньшее зло энтерпрайза.

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

Для сравнения смежная по назначению концепция API хороша именно обьективно — это четкий вход-выход из изолированного мирка кода решающего конкретную задачу для всех желающих
Слушайте, ну можно же приватные поля создать через замыкание. Автор напирает на то, что хитрые конструкции и всё это сложно для начинающих… Так может это им (начинающим) и не нужно вовсе.
НЛО прилетело и опубликовало эту надпись здесь
Где-то в тот момент, когда заканчивается первый пункт про типизацию, начинается ад и ересь. JS поддерживает ООП. Некачественного кода полно на любом языке. Фреймворки нужны в любом языке.
В оригинале: «JavaScript doesn’t do OOP»

И это правда. ДжаваСкрипт не годен для ООП разработки. Как-то сахарно может и чем-то костыльно поддерживает, но не является ООП-языком. Как и Си, например.

ДжаваСкрипт умеет прикидываться функциональным языком. При должном старании программиста можно. Да только смеются функциональщики над такой сладкой поддержкой))
Смотря какой смысл вкладывать в понятие ООП. И в понятие «функциональный». Короче, в итоге всё сводится к тому, что JS не оправдывает ожиданий конкретных людей. Возможно, проблема всё же в ожиданиях?
Точно сказано!
Вывод: JS не оправдал ожиданий. Детей к нему не допускать.
Я как-то пытался ответить на вопрос — чем JS классы — не классы.
Так и не смог.
Если применить широкоизвестный метод утиной типизации для сравнения JS и C++ — то таблица виртуальных методов в C++ крякает как прототипы в JS.

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


В языке отсутствует стандартная библиотека. Отсюда эти кошмарные npm, сотни зависимостей даже для "Hello world", тысячи и десятки тысяч для любого нетривиального. Все это обновляется по нескольку раз в день. С изменениями в API. С конфликтами версий. С необходимостью регулярно вникать что там поломалось и почему.


Недавно я с обеда пришел и за время проведенное на обеде (1 час), какая-то зависимость сменила две версии. Я не шучу… Надо было сделать скриншот.


На мой взгляд, это кошмар.


Но вообще эту тему можно долго продолжать. Просто и так уже на несколько минусов наговорил и использовал единственную возможность что-то сказать за день.

Мне кажется, что JS, как большая и самостоятельная экосистема, только-только начинает становиться. Появляются новые сферы применения языка, новые современные плюшки вроде классов тех же самых, воркеры, которые и есть, можно сказать, настоящая многопоточность. В общем, язык устаканивается. А то, что какая-то зависимость сменила 2 версии за час, так это же не JSa проблема, а разраба либы. Молодец, что быстро пофиксил глюки.
современные плюшки вроде классов тех же самых

Вот уж современная плюшка, так современная.
Что плохого, если либа сменила минорные версии. Значит над ней интенсивно работают. А работать могут сразу несколько человек. Но это конечно неверный флоу. Исправления надо тестировать и даже минорные исправления должны быть накопительными.
НЛО прилетело и опубликовало эту надпись здесь
Потому что это ни разу не «просто» Спросите у Дарта
НЛО прилетело и опубликовало эту надпись здесь
На самом деле на фронте альтернативы тоже есть. TypeScript, coffee, Elm, тот же Дарт…
Я бы не назвал это полноценной альтернативой языку JS ибо всё это суперсеты js. Немного разный синтаксис и фишки, но язык то тот же.
Ну почему же? У всех этих языков разные парадигмы, js тут выступает в роли «jvm» по сути.
Парадигмы разные, но движок один и тот же. Посему и не совсем. Это не одно и тоже, но и не совсем разное )

Вы ещё скажите, что Java, Scala, Kotlin и Clojure – не совсем разные, потому что у них один движок – JVM. Да и у нативно компилируемых движок один – машкод, поэтому C++, Haskell и Common Lisp тоже не совсем разные.

НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Можете писать сайт руками на чистом JS, который будет весить в сумме как самая маленькая картинка и запускать сайт через 3 месяца.
Шта? Не так уж и давно, поголовно и массово запускали сайты на чистом js все кому не лень. Примерно за неделю, максимум две. Ага, так и было. Всего то лет с десять назад. А может быть «те» люди, которые запускали все это дело на js — понимали что они делают? Ну а как иначе вы объясните сей «феномен»?)
НЛО прилетело и опубликовало эту надпись здесь
Все это обновляется по нескольку раз в день. С изменениями в API. С конфликтами версий. С необходимостью регулярно вникать что там поломалось и почему.

npm конечно не без проблем, но вы явно перегнули. К тому же уже давно есть package-lock
Сам исследую использование ES для обучения детей, но фокус в статье настораживает:
1. Незнание «use strict»?
2. Классическое ООП от родоначальника Smalltalk. Гораздо шире в возможностях (динамическое наследование, множественное наследование и т.п.).
3,4. Имхо, JavaScript оказался в тени проблем npm.
JavaScript, насколько я понимаю, поддерживал и поддерживает полноценное ООП, только оно сделано в прототипном стиле.
Да, JS поддерживает все парадигмы программирования так или иначе. И это одна из важнейших причин, почему к нему не стоит подпускать новичков.

Язык для вхождения в программирование должен быть кристально прост и непробиваем. Как Паскаль или Лисп в древности.

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

А я бы добавил к недостаткам/сложностям/вызовам для новичков ещё асинхронность языка. Это усложняет понимание кода. Можно конечно писать для начала и без асинхронности, но это важная часть языка.

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

Просто для тех задач, где он используется (UI, обработка веб-запросов в Node.js) асинхронность — это необходимость.

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

По названию я подумал, что это будет самая короткая статья на хабре:
Нет. <Конец>
JavaScript — лучший язык программирования для начинающих. Так это или нет?

Короткий ответ — «нет», длинный — тоже «нет».
Помимо того, что перечислил автор, нужно еще добавить тот факт, что в JS все меняется настолько быстро и это все заставляет новичка просто рыдать. Вчера люди использовали коллбэки, сегодня промисы, а завтра уже все на fetch. Про фреймворки и говорить не стоит. Но плюсы при изучении все же есть. Ютуб просто завален видео про JS, полно статей и прочие вещи, которые помогут на начальном этапе обучения.
Каша у вас какая-то. При чем тут fetch. И хватит уже промисами всех пугать, они уже лет 5 как не «новая фишка».
Новичку js не подходит. По одной причине. Js позволяет вообще не думать…
И даже думающий человек связавшись с js — 99.9% времени потратит на «покеты». И всего лишь 0.01 на js. В этом пока главный недостаток js в целом.
Порог вхождения минимален. Любой дебил может «писать» на js, замешивая «покеты вкучу». Вот только обычно у таких «писак», коих 99.9% — исключительно и только — одно говно получается. Что собственно и видно повсеместно, даже невооруженным взглядом.

Новичку единственное что нужно — это универ. Сильно, очень сильно сократит обучение ремеслу. Это кажется, что 5 лет для js не нужно. Однако, любой дебил без универа самостоятельно и внятно не поймет js и за 200 лет…
Я как новичок, не считаю что JS хорош для новичков, во первых мало знать один лишь JS, вообще мало знать синтаксис, надо уметь что то делать на этом языке, а вот тут то и всплывает факт, что сейчас чистый JS мало где используется, сейчас нужно знать фреймворки например React, Vue или Angular, неплохо бы знать ещё Nodejs, в итоге чтобы найти работу или что то сделать надо учить дополнительно много чего. Я считаю что в этом плане лучше Python, он позволяет очень быстро буквально в пару строк сделать что то полезное, например почистить файлы или сделать парсер курса валют или телеграмм бота и при этом все очень быстро и код получается понятный и короткий. Опять на Nodejs нет нечего подобного по типу Django, поверьте я изучал сперва JS + AngularJS +Express+ Nodejs, могу без проблем написать CRUD, но только это никому не нужно. поэтому для себя решил освоить React для фронтенда и Django для бекенда.
Я как новичок, не считаю что JS хорош для новичков

В статье все-таки речь идет о детях. Не думаю что у них цель — получить работу по завершению курса.
javascript ну нафиг, лучше уж python.
ps: как на этом прекрасном языке записать данные в файл на диск, получить список bluetooth устройств по близости или найти все собственные вектора матрицы.
Например такой:
|  3 -4  4 |
|  2  3  2 |
|  2  0  5 |
1)
require('fs').writeFile(...)


2)
const bluetooth = require('node-bluetooth');
const device = new bluetooth.DeviceINQ();
device.listPairedDevices(console.log);


3) Точно так же как нa питоне.
3) Точно так же
import numpy as np
m=np.mat([[3,-4,4],[2,3,2],[2,0,5]])
w,v=np.linalg.eig(m)

python не способен найти все собственные вектора этой матрицы
nympy это не python, а библиотека. Напишите на чистом python, и сравните с реализацией на js. Алгоритмически выйдет одно и то же.
Ну и вообще, 100% есть какая-нибудь либа на js для этого)
Ещё нехватало, чтоб рандомные скрипты из интернета мне что-то на диск писали.
… подддержку (script language=%good_language%) (скобки треугольные) в firefox. И добавляйте понемногу.
Какой язык подойдет для этого?
Лучшее в JS то что он «a lisp». Скриптовый язык с очень маленьким количеством ограничений.
Пресловутые лисповские функции которые возвращают функции в js это обыденность в лице коллбеков которые делают даже джуны.

Очевидными способами можно воспроизводить функционал макросов и эвалей.

Ну и интеграция с html/css хорошая «из коробки», особенно если добавить jQuery.
С тем-же jQuery ещё и всякий парсинг и вообще работа с нетом в целом становится простой.
Лучшее в JS то что он «a lisp».
Никогда не понимал этой фразы. Лямбда-функции были ив других языках, они не становятся из-за этого «a lisp». Чтобы быть «a lisp», нужна как минимум гомоиконность.
Оригинал: «JavaScript is the only candidate.»
Перевод: «JavaScript — это единственная альтернатива.»
Вывод: оказывается, переводчикам статей о языке JavaScript не обязательно уметь в язык русский.
Альтернатива не бывает единственной, она бывает только чему-то ещё.
Альтернатива не бывает единственной
Безотносительно точности перевода: альтернатива вполне бывает единственной.

Как тут не вспомнить:
image

JS хорош тем, что им можно обмазать язык Lua, и вот там, в песочнице, уже можно спокойно резвиться детям.
JavaScript не поддерживает ООП

Странное утверждение для языка, где все переменные априори являются экземплярами тех или иных классов.
Технически это неверно. Значения примитивных типов не являются экземплярами классов.
Не являются. Просто в определённых обстоятельствах для них создаются объектные обёртки. Это легко проверить:

let a = 1;
a.b = 2;
console.log(a.b); //undefined
Вы уверены? Есть ссылка на соответствующую доку. Я туда не копал и утверждать не могу, но могу написать класс аналогичный намберу «а» и пропустить его через проксю, в которой буду перехватывать операции присвоения и игнорировать их. И это получится объект, но ему нельзя будет присвоить свойство. Так же объекту можно поставить свойство writable: false. И это тоже больше похоже на наш пример.
В питоне такой пример вообще не пройдёт. Будет ошибка во торой строчке.
Погуглите «javascript boxing unboxing».
Согласен, спасибо ) День прошёл не зря )
Кстати, если так задуматься, это аргумент против того, чтобы js давать новичкам. Весьма неочевидный способ выстрелить себе в ногу.
Я начинал с питона и щас с удовольствием сижу на typescript. Но так для себя думаю, что питон для начала более выгодный язык. У js достаточно много подводных и не всегда очевидных вещейю А на гарвардском курсе SC50 вообще начинают с С. Что тоже есть весьма неплохо ибо понимаешь как оно всё устроено.
Понимать как всё устроено лучше после того, как понимаешь, что именно устроено) Я учился на паскале, и мне кажется, это неплохой выбор. Минимум неочевидностей.
Спасибо! Теперь буду знать.

Чёт я не думал, что модификаторы доступа являются определяющим фатором ООП… В JS всё — объекты. Способы организации кода — это другой вопрос. Нужны модификаторы — typescript. JS прекрасен хорошей поддержкой одновременно разных парадигм. Если нужна какая-то одна парадигма — есть куча надстроек, которые улучшают как функциональный стиль так и ООП. Я уже не говорю про поддерживаемые платформы.
На самом деле, для меня загадка, почему уже практикующие разработчики до сих пор ставят вопрос об обучении новичков с выбора первого языка программирования.
Все же это программирование это не просто кодинг, но алгоритмизация и понимание происходящих «под капотом» процессов.
Я бы рекомендовал странную, но довольно эффективную связку:
1) Начать с Python. Это язык, который менее всего отвлекает от осмысления самих алгоритмов, не сбивая новичка сложностями реализации. У него есть крупное коммьюнити, отличные мануалы и более-менее однозначный стиль написания кода. Человек научится искать ответы на вопросы (потому что будет их находить), больше времени посвящать разбору алгоритмов, перенося навык их построения на кончики пальцев и видеть результат, который легко изменять, не переписывая весь костяк своего кода.
2) Потенциальный начинающий уже не впадает в ступор перед простыми алгоритмами: он с ними экспериментировал, пробовал, ошибался, менял и «лечил» свой код. Самое время посмотреть под капот. Это C++. ООП, не прощающий ошибок. Ссылки, указатели, понимание работы с памятью на низком уровне. Типы данных и почему так важно их знать.
И на этом этапе надо взять и переписать все то, что уже писал на питоне. Это даст мощный пинок к пониманию самых азов.
А дальше — свободное плавание. Человек выходит после двухступенчатой пытки уже навыками отладки, чтения документаций и слезных просьб коммьюнити о помощи.
В который раз уже совершается попытка прикопаться к JS приводя пример, в котром складывается число и строка. Смущает неявное приведение типов — делай это явно.

Почему некоторые индивиды так негодуют из-за отсутствия строгой типизации в JS? Я не понимаю что она дает такого. Кому не сложно приведите пример.

Если очень хочется иметь проверку типов, или нет возможности писать понятный код, на помощь спешит JSDoc, без всякого TypeScript и Flow, позволят описать тип переменной, и любой более-менее адекватный редактор подсветит код противоречащий этому описанию.

Столько слов сказано о том что классы в JS это лишь синтаксический сахар, а что в конечном итоге не синтаксический сахар?
Помимо сложения разных объектов. Еще не консистентные операции сравнения, eще this. области видимости переменных и многое другое, что делает язык ущербным.
nodejs конечно решает очень много проблем, но это не заслуга языка.
Сам js как был с «особенностями» так и остался.
Короче — для обучения людей худшего языка программирования придумать трудно.
Ого, как субъективно.
Легко. PHP, VBA, C++.
Согласен VBA — это еще один пример жуткой жути. Видимо именно поэтому microsoft его выбрал в качеств основы для VBScript. VBS и javascript — встроенные скриптовые языки в винду что бы нормальный человек туда не совался.
Для обучения программированию PHP также не пригоден как и VBA.
Но несмотря на ужасы и кошмары PHP, C++, VBA и js они являются полными языками и при желании можно писать можно всё что угодно. Но количество усилий для выполнения одинаковых задач могут отличатся на порядки. Для своих ниш это практически монополисты. А по наличию противоречий все языки хороши.
Вижуал бейсик — это вообще самое страшное, что я видел в из языков программирования. Видел более сложные, но более дурацких не встречал. Всё-таки вы очень пристрастны, если всерьёз сравниваете JS и VBA.
Язык программирования это всего лишь инструмент. Если все превозносят кривой инструмент и пихают его во все щели не обращая внимания на явные косяки, он от этого лучше не станет.
Mocha (javascript) это тупиковая ветвь, ничего революционного в нем нет. Более того в него изначально заложены противоречия которые обязательно всплывут. А строить что-то на плавающем фундаменте можно только, очень не надолго.
А вы таки знаете инструмент без косяков?
Вот тут прям очень несогласен.
Mocha вместе с sinon/chai/nock(не всегда нужен конечно), плюс nyc для проверки покрытия юнит тестами и будет счастье
А чем вам this не угодил? У него есть правила, как в русском языке. Знаешь правила — знаешь куда this ссылается.

И правила эти достаточно простые.

Именно. Их не много и они не сложные. Один раз понял — всю жизнь катаешься )
— Итак, дети, сегодня мы пойдем по другому пути и не будем использовать эти богомерзкие языки с их динамической типизацией, потому что это сложно для понимания.
* через полчаса *
— Нет, Витя, ты не можешь результат 1,5 умножить на 2 записать в эту переменную, потому что результат не целочисленный. Ну и что, что результат равен 3, это уже не целое все равно. Это же очевидно!

Отличный пример.
думаю при обучении играет немаловажную роль еще такая вещь как доступность.
Какие действия необходимо совершить, что бы начать изучать js? python?
Какие действия неоходимо совершить что бы начать изучать C#? C++?
И в целом, если подумать, цель в изучении принципов программирования, а не конкретных подходов, на конкретном ЯП, для решения конкретных задач.

Языки с явными типами проще для понимания начинающими, чем языки с неявными (и закулисными их преобразованиями по неочевидным правилам). Тип у переменной в рантайме есть всегда.

Иногда, чтобы понять где и какие углы можно безболезненно срезать, нужно разобраться в сущности и причинах расположения данных углов. После этого можно будет выбирать, когда резать, когда — нет.
Достаточно субъективно. На мой взгляд, начинающие программисты далеко не всегда знают заранее и наперед, какой тип данных им понадобится через N строчек. И динамическая типизация более щадящая для них в этом плане — позволяет больше думать о решении задачи, а не о том сколько байт выделить для числа, что в рамках конкретной задачи может быть абсолютно неважно. Человек может абсолютно верно решить задачу в логическом плане, но его программа не соберется. Значит ли это, что он не понял решение конкретно этой задачи? Опять таки, мы говорим о начинающих программистах и не будем принимать в расчет аргументы, когда статическая типизация хороша, потому что она статическая.
начинающие программисты далеко не всегда знают заранее и наперед, какой тип данных им понадобится через N строчек.

Этому они и должны учиться, если хотят стать инженерами, а не ремесленниками.

Разумеется, это очень субъективно.
Как человек, начавший с бэйсика, и перешедший к C через ассемблер, могу сказать, что прекрасно помню, как изучение С вызывало только положительные эмоции. Потому что было абсолютно понятно, какого ускорения и упрощения люди добились с его помощью.

Я считаю, что понимая низкоуровненвые вещи, значительно проще понять абстракции, выстроенные поверх них. Здесь есть принципиальная разница между «понять» и «использовать». Использовать — уровень технаря ПТУ (при всём уважении к золоторуким мастерам), понять — инженера конструктора.

У меня есть небольшой опыт обучения ребёнка (1шт.) программированию. Так вот, бэйсик и ассемблер мы, по очевидным причинам, пропустили а начали с основ устройства процессора и памяти компьютера, и С99. Не сказать, что начало было лёгким и простым. Зато, хорошенько поднатаскавшись кодить операции с основными структурами данных вручную, человек с радостью воспринял С++/ООП и его немалые удобства, затем поглядел на Java до уровня понимания, чем она отличается, чем уникальна и в чем основные подвохи, по моему совету углубился в JavaScript/Node.js (как основу сегодняшнего бизнес-веба), что-то там покрутил на Python (но в отсутствии реальных больших задач, я полагаю, не сильно больше поверхностного представления о нём получил).

Так вот теперь он стоит на распутье, полезно ли будет ему потратить 5 лет жизни на усиленный матан, дифуры, дискретку и не первой свежести знания по практическому программированию в университете, или же развиваться самостоятельно в интересных ему направлениях и достойных командах.
Вот этот выбор между реальными немалыми деньгами сегодня и 5ти-летними инвестициями не понятно во что, я Вам скажу, похлеще того, с какого же именно языка нужно было начинать.
И что же это за задача такая, в которой заранее известно, что результат будет 1.5 * 2? Почему бы тогда сразу не написать 3? Ваш пример просто высосан из пальца: в реальной задаче будет вполне очевидно, почему произведение дроби на целое число нельзя без округления записать в целочисленную переменную…
Естественно не целое)
Там будет 3.000000000000001 «как обычно».
И смысл в том, что получите вы три, или не три — большоооой вопрос…
А что делать, если оно не три?
Слушайте, тут только искренне лютого извращенца такое устроит...
Это же очевидно!

пс: При этом, математических либ никто никогда не будет юзать. А встроенных дробей нету.
Должен быть тип рационального числа вообще-то. И проблем с умножением тогда и не будет. 2 * 3/2 = 3 — ШЕДЕВРАЛЬНО!!! НЕ ТАК ЛИ?))) Слушайте, ну если вам не нужны скорости, а важна логика — то почему дробей-то нет в этом вашем js из коробка?
ппс: Уже даже в калькуляторах дроби есть, причем давно уже. А в езыках программирования нету. Замичательно живем, не правда ли?
Разве от таких вещей как опечатки и подобные минорные ошибки не спасает хорошо настроенный линтер?

Про ООП — и да и нет, но как видно js в эту сторону вроде как развивается.

Плохой код, как мне кажется, последствия развития и внесения новшеств в язык, хотя может я и не прав.

А громоздкость фреймворков и библиотек это не только проблема js — не буду тыкать пальцем на все похожие примеры, но для начала можно вспомнить php-шный zend
Зарегистрируйтесь на Хабре, чтобы оставить комментарий