Сто лет как ставлю точку с запятой в конце JS-выражений, и даже не задумывался почему. Но коллега, из современных фронтендеров, задал вопрос, зачем я это делаю: жму лишнюю кнопку в конце каждой строки, ведь прогрессивная молодёжь агитирует так не делать.

Задумался, и постарался собрать аргументы.

Формальная грамматика языка JS требует точек с запятой

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

Разработчики сомневались на этот счёт: в ранних версиях JS 2.0 автоматическое добавление было вообще выброшено из языка, но затем всё-таки вернулось, ради снижения порога входа. И поначалу не работало в Strict Mode.

Нельзя просто взять и не писать точку с запятой

Точка с запятой будет автоматически добавлена в трёх случаях:

  • When a token not allowed by the grammar is encountered, and it’s separated from the previous token by at least one line
  • When the end of the input stream of tokens is reached
  • When the grammar forbids line terminators in some place but a line terminator is found (++, --, continue, break, return, throw, yield, (param), async)

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

a = b + c
(d + e).toString()

это то же самое, что и

a = b + c(d + e).toString()

Вместо старой привычки всегда писать в конце точку с запятой нужно обзавестись новой

Какие-то чуваки собрались и написали открытый стандарт на оформление JS, и сайт с удобной документацией и тулзами. В своём стандарте они агитируют не использовать точки с запятой и ссылаются на заметки: 1, 2, и видосик 3

Аргументы такие: люди, которые только знакомятся с языком, не понимают, почему в одном случае надо писать точку с запятой, а в другом - нет:

function a() {
} // Не нужна точка с запятой

const a = () => {
}; // Нужна точка с запятой

Да, новичкам сложно. Но как справляться с неоднозначностью и не писать точки с запятой в конце выражений?

А очень просто! Нужно писать точки с запятой в начале выражения!

Полное правило такое:

Никогда не начинайте строку с символов [, (, `, +, *, /, -, ,, .. А если всё-таки надо - пишите в начале строки точку с запятой.

;(function () {
  window.alert('ok')
}())

А если вам часто приходится так писать - прекратите умничать! Пишите проще!

Вместо:

;[1, 2, 3].forEach(bar)

Рекомендуется:

var nums = [1, 2, 3]
nums.forEach(bar)

А один из авторов, на которого ссылаются пропагандисты такого подхода, утверждает, что написание точки с запятой в начале строки и так прекрасно, и менять её ни на что не надо: “Префиксный способ намного понятнее и нагляднее, чем суффиксный”.

То есть, если я хочу избавиться от привычки бездумно ставить точку с запятой в конце каждого выражения, я должен:

  1. Выучить набор исключений, какие символы не должны начинать строку
  2. Перед такими символами приучиться ставить точку с запятой
  3. Чтобы понять, заканчивается ли выражение на текущей строке, всегда смотреть на следующую строку - а не начинается ли она на точку с запятой?

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