Такие языки, как C ++, не будут работать, если точки с запятой забыты, но другие языки, такие как JavaScript, будут автоматически включать их для вас.
Я знаю из этой статьи Вы рекомендуете использовать точку с запятой после каждого оператора в JavaScript?, что рекомендуется использовать точки с запятой, и существуют сценарии, которые могут создавать нежелательные неоднозначности (такие как зависание в C ++, когда фигурные скобки не используются).
В какой-то момент должно было быть решение сделать их необязательными (например, когда создатели JavaScript сделали сознательный выбор сделать его необязательным).
Я хотел бы знать, почему было принято это решение и как оно выгодно пользователям этих языков.
Фон: я начинающий программист и только недавно начал изучать JavaScript.
РЕДАКТИРОВАТЬ: На комментарии, которые говорят, что это плохо в JavaScript, я знаю. Я спрашиваю, почему это вообще допускается, если большинство людей считают это плохой практикой.
Что касается JavaScript, Дуглас Крокфорд объясняет происхождение идеи в это видео. (Это отличный разговор, и он действительно стоит вашего времени, чтобы посмотреть его, если вы намерены продолжать использовать JavaScript.)
Это прямая цитата из выступления:
Вставка точки с запятой была предназначена для облегчения синтаксиса языка C для начинающих.
Насколько это выгодно пользователям языка, Крокфорд подробно объясняет несколько причин, почему не выгодно, но, скорее, как это вносит очень серьезные неясности и ошибки в синтаксис. Один из наиболее заметных случаев — попытка вернуть литерал объекта, используя стиль кодирования «фигурные скобки слева» (источник из видео):
return
{
ok: false
};
Который на самом деле возвращает неопределенное значение, потому что точка с запятой добавляет один после return
и оставшийся литерал предполагаемого объекта анализируется как блок кода, эквивалентный следующему:
return;
{
ok: false;
}
Попытка облегчить язык для начинающих может стать хорошим источником благих намерений.
Автор языка JavaScript, Брендан Эйх, имеет блог на эту тему под названием Адская точка с запятой на тему автоматической вставки точек с запятой (ASI).
Соответствующие цитаты:
ASI — это (формально говоря) процедура исправления синтаксической ошибки.
Хотелось бы, чтобы в эти десять дней в мае 1995 года новые строки стали более значимыми в JS. Тогда вместо ASI мы бы проклинали необходимость использовать инфиксные операторы в концах непрерывных строк или, возможно, или в скобках с использованием грубой силы, заставить продолжение на последовательной линии. Но этот корабль проплыл почти 17 лет назад.
Мои два цента: будьте осторожны, чтобы не использовать ASI, как если бы он дал JS значительные переводы строк.
Давным-давно, в далеком, пыльном прошлом подобные вещи делались в первую очередь для того, чтобы компенсировать тот факт, что циклы компиляции / компоновки / запуска измерялись как минимум часами и часто выполнялись более суток. Это может быть (хорошо: было) крайне неприятно ждать несколько часов результата, только чтобы обнаружить, что компилятор остановился на строке 3 (или что-то еще) из-за какой-то глупой опечатки.
Чтобы попытаться бороться с этим, некоторые компиляторы того времени пытался чтобы угадать ваше предполагаемое значение, поэтому, если опечатка была достаточно незначительной (для некоторого определения «достаточно незначительный»), она бы предположила, что знает, что вы действительно хотели, и продолжит компиляцию (и, возможно, даже выполнение), несмотря на ошибку.
Те, кто не в состоянии изучать историю, обречены ее повторять. Те, кто слишком высокомерен, чтобы учиться у истории, повторяют это тоже. Вероятно, есть место для серьезных дискуссий о точном типе дефектов символов, которые могут привести к тому, что разработчик языка совершит эту ошибку в настоящее время. Гораздо меньше места (вообще-то, вообще нет) для споров о том, является ли это ошибкой, хотя — она, безусловно, и непростительная.
в javascript точка с запятой — это разделитель операторов, как и переводы строк, поэтому они вам не нужны, если в каждой строке есть оператор.
другие языки, такие как C ++, имеют только; как разделитель и пробелы, как переводы строк, ничего не делают. Есть плюсы и минусы
в C ++ это означает, что синтаксис является последовательным
если ты пишешь
int x=0;
x++;
если вы затем сожмете до одной строки, его общий синтаксис:
int x = 0; x++;
в JavaScript, если вы пишете
var x=0
x++
тогда если вы сжали до одной строки
var x=0 x++
будет проблемой
вам нужно сделать var x=0; x++
Таким образом, большое значение имеет то, является ли пробел существенным или нет. В идеале язык должен последовательно использовать один механизм. Но для javascript он смешанный, поэтому оставляет немного неопределенности при использовании;