JS Semicolons
Сто лет как ставлю точку с запятой в конце 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)
А один из авторов, на которого ссылаются пропагандисты такого подхода, утверждает, что написание точки с запятой в начале строки и так прекрасно, и менять её ни на что не надо: “Префиксный способ намного понятнее и нагляднее, чем суффиксный”.
То есть, если я хочу избавиться от привычки бездумно ставить точку с запятой в конце каждого выражения, я должен:
- Выучить набор исключений, какие символы не должны начинать строку
- Перед такими символами приучиться ставить точку с запятой
- Чтобы понять, заканчивается ли выражение на текущей строке, всегда смотреть на следующую строку - а не начинается ли она на точку с запятой?
Спасибо, но я, пожалуй, продолжу тупо всегда писать точки с запятыми, вместо того, чтобы запоминать список ограничений, когда я должен написать префикс, а когда не должен. И не буду читать лишний код, только для того, чтобы узнать, что его я мог и не читать.