В JavaScript точки с запятой являются необязательными. Да, вы не ослышались.

// Both statements work the same way
console.log("Hello")
console.log("Hello");

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

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

Это исчерпывающее руководство по использованию точек с запятой в JavaScript.

Сначала мы рассмотрим правила использования точек с запятой в коде JavaScript. Затем вы узнаете, как работает автоматическая вставка точки с запятой за кадром. И последнее, но не менее важное: вы увидите список плюсов и минусов использования точек с запятой.

В конце этого руководства вы будете в состоянии решить, хотите ли вы использовать точки с запятой или нет.

Руководство по использованию точек с запятой в JavaScript

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

Необходимое использование: Разделить два оператора в одной строке

Если у вас есть два оператора JavaScript в одной строке, вы должны разделить их точкой с запятой. Возможно, самым распространенным примером этого является цикл for.

Например:

const numbers = [1, 2, 3, 4, 5];

for (let i = 0; i < numbers.length; i++) {
    console.log(numbers[i]);
}

На выходе:

1
2
3
4
5

Цикл for не будет работать без точки с запятой, в случае если его условие задается в одной строке.

Необязательное использование: Точки с запятой как разделители операторов

Кроме разделения операторов для одной строки, в JavaScript нет других обязательных случаев использования точки с запятой. Однако, по желанию, вы можете использовать точку с запятой для завершения оператора, даже если были разрывы строк.

Вот несколько распространенных примеров операторов, которые можно завершить точкой с запятой:

let i;                        // variable declaration
i = 5;                        // value assignment
let x = 9;                    // declaration and assignment
var fun = function() {...};   // function definition
alert("hi");                  // function call

Помните, что все вышеперечисленные точки с запятой необязательны. Код будет работать и без них.

Избегайте точек с запятой

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

Избегайте точек с запятой после '}'. Не ставьте точку с запятой после закрывающей фигурной скобки '}'.

Единственным исключением является оператор присваивания, например, такой:

var data = {name: "Alice", age: 25};

В этом случае можно использовать точку с запятой.

Вот несколько примеров того, как не использовать точку с запятой после закрывающей фигурной скобки:

if  (...) {...} else {...}
for (...) {...}
while (...) {...}
function (arg) { /* actions */ }

Избегайте точки с запятой после ')' в операторах if, for, while или  switch.

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

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

Не добавляйте точку с запятой после закрывающей скобки ')' в:

  • операторах If

  • циклах For

  • циклах While

  • операторах Switch 

Давайте рассмотрим пример того, почему это важно помнить.

Если вы напишете оператор if следующим образом:

if (0 > 1); { console.log("Hello") }

Это эквивалентно следующему:

if (0 < 1);

console.log("Hello")

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

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

Ранее в этой статье вы видели пример цикла for с точкой с запятой. Это исключительный случай использования точки с запятой.

Взгляните на этот простой цикл for:

for (let i = 0; i < 10 ; i++) { } // Works

Как вы можете видеть, точка с запятой не ставится сразу после i++.

На самом деле, после третьего оператора в цикле for нельзя ставить точку с запятой.

Если вы так сделаете, то возникнет синтаксическая ошибка:

for (let i = 0; i < 10 ; i++;) { } // SyntaxError

Это все, что вам нужно знать, когда речь идет о правилах использования точек с запятой в JavaScript.

Теперь давайте вкратце обсудим, почему использование точек с запятой в JavaScript необязательно.

Автоматическая вставка точки с запятой в JavaScript

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

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

Все происходит "за кулисами", и вы ничего не заметите.

Такой процесс называется автоматической вставкой точек с запятой (Automatic Semicolon Insertion. ASI).

Правила ASI в JavaScript

Парсер JavaScript добавляет точку с запятой в любом из следующих случаев:

  1. Следующая строка кода начинается с кода, который явно прерывает текущую строку кода.

  2. Когда следующая строка кода начинается с '}'.

  3. При достижении конца файла.

  4. Если любой из следующих операторов встречается в виде отдельной строки 

  • return (возврат)

  • break (прервать)

  • throw (выбросить [ошибку])

  • continue (продолжить)

Важно понимать, что ASI не всегда корректен на 100%.

Точка с запятой используется для разделения операторов в JavaScript, а не для их завершения.

Это то, что ASI пытается сделать за вас.

Если говорить проще, то правила ASI можно сформулировать следующим образом:

Не каждый перенос строки требует точки с запятой. Однако разрыв строки, который не поддается парсингу без точки с запятой, нуждается в ее использовании.

Например:

let x
x
=
10
console.log(x)

Этот фрагмент кода интерпретируется ASI как:

let x;
x = 10;
console.log(x);

В данном случае ASI проделал отличную работу, сумев разобраться в том, как продолжается код между строками 2-4.

Однако иногда он может не знать, чего мы пытаемся достичь.

Например, данная строка кода приводит к ошибке

const s = 'World'
const ab = "Hello" + s

[3].forEach(n => console.log(n))

В результате возникает следующая ошибка:

Uncaught TypeError: s[3].forEach is not a function
    at <anonymous>:4:5

По описанию ошибки вы уже можете догадаться, почему это происходит.

Причина, по которой этот валидный фрагмент кода не работает, заключается в том, что ASI не вставляет точку с запятой после второй строки.

Вместо этого, он интерпретирует строки 2 и 4 как продолжение одного и того же оператора следующим образом (в соответствии с правилом ASI номер 1):

const s = 'World';
const ab = "Hello" + s[3].forEach(n => console.log(n));

ASI думает, что s - это массив, и вы пытаетесь получить доступ к его 4-му элементу с помощью s[3].

Но это не то, что вы планируете осуществить.

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

const s = 'World'
const ab = "Hello" + s;

[3].forEach(n => console.log(n)) // Prints '3'

Теперь код работает так, как предполагалось.

Другой пример, когда ASI может вызвать проблемы, - это операторы return (возврат).

Например:

function getData() {
  return
  {
    name: 'Bob'
  }
}

console.log(getData())

На выходе:

undefined

В результате выводится undefined (неопределенное значение), хотя подразумевалось, что появится имя { name: 'Bob' }.

Так происходит потому, что 4-е правило ASI гласит, если оператор return встретился в виде отдельной строки, то ставится точка с запятой.

Поэтому ASI видит приведенный выше код следующим образом:

function getData() {
  return;
  {
    name: 'Bob'
  }
}

console.log(getData())

Другими словами, функция getData() ничего не возвращает, а затем случайным образом создает объект, с которым ничего не делает.

Таким образом, в консоли вы видите undefined.

Для исправления этого нужно добавить открывающую фигурную скобку в ту же строку, что и оператор return:

function getData() {
  return {
    name: 'Bob'
  }
}

console.log(getData())

На выходе:

{
  name: "Bob"
}

Теперь данный фрагмент кода работает как положено.

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

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

Почему вы должны использовать точку с запятой: 5 причин

Использование или неиспользование точек с запятой вызывает жаркие споры среди веб-разработчиков.

Вот 5 причин, по которым вы должны использовать точку с запятой в своем коде.

1. Иногда обязательна

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

Например, если вы пишете цикл for, необходимо использовать точку с запятой при указании параметра цикла и условий. В противном случае цикл не будет работать.

Кроме того, ASI (автоматическая вставка точки с запятой) JavaScript не всегда точен на 100%.

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

Один из таких примеров вы также видели ранее в этом руководстве.

2. Вы привыкли использовать точки с запятой

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

В некоторых других языках широко используются точки с запятой, поэтому привыкание к ним является обычным делом. Если ваш мозг не воспринимает код JavaScript без точек с запятой, зачем от них отказываться?

Не стесняйтесь использовать точки с запятой, чтобы сделать код более понятным для вас, если это то, что вы привыкли делать.

3. Явно указывает на окончание оператора

Точка с запятой - это простой способ четко обозначить окончание оператора. При использовании точки с запятой нет места для путаницы. Строка кода заканчивается на точке с запятой.

4. Меньше поводов для беспокойства

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

После каждой строки кода вам не нужно задумываться о том, испортит ли отсутствие точки с запятой ситуацию или нет. Однако ASI все равно может все испортить, как вы видели на примере оператора return.

5. ASI может быть изменен

Правила ASI могут измениться в будущем. Хотя это и маловероятно, но такое возможно. Таким образом, полагаться на правила ASI о вставке точек с запятой всегда по одному и тому же принципу надежно не на 100%.

Если вы пишете код с учетом текущего ASI, то можете столкнуться с некоторыми проблемами, если правила поменяются. Но имейте в виду, что в 99,9% случаев ASI выполняет свою работу корректно. Более того, правила вряд ли изменятся в ближайшее время.

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

Почему не следует использовать точки с запятой: 3 причины

Обратите внимание, что если вы слышите, как кто-то говорит: "Никогда не следует использовать точку с запятой", то он ошибается. Это потому, что точка с запятой в редких случаях обязательна.

В любом случае, давайте поговорим о минусах точек с запятой, перечислив 3 причины, по которым их не следует использовать.

1. Точки с запятой вставляются автоматически

Как вы уже выяснили, точки с запятой вставляются ASI. Таким образом, вам не нужно писать то, что все равно будет проигнорировано.

2. Меньше написанного кода и меньше шума

Каждый символ кода влияет на читабельность и качество кода. Если вы не используете точки с запятой, то тем самым сэкономите символы в каждой написанной строке кода.

3. Несколько операторов в одной строке - плохая практика

Использование точек с запятой позволяет записывать по несколько операторов на одной строке. Но это плохая практика.

Вы никогда не должны писать операторы в одной строке (если это не требуется).

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

Так использовать точки с запятой или нет?

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

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

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

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

Если вы пропустили одну точку с запятой, то пропускайте их все (кроме обязательных). Вы также можете настроить свой линтер на автоматическое удаление точек с запятой.

Заключение

Сегодня вы узнали об использовании точек с запятой в JavaScript. Напомним, что точки с запятой не являются обязательными в JavaScript. Вместе с тем, процесс автоматической вставки точки с запятой (ASI) добавляет точки с запятой там, где это необходимо.

Однако ASI не является правильным в 100% случаев. Кроме того, в некоторых ситуациях вы просто обязаны использовать точку с запятой. Иначе код не будет работать.

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

Спасибо за прочтение. Надеюсь, вы нашли это полезным. Удачного кодинга!

В заключение хочу порекомендовать всем заинтересованным два полезных бесплатных вебинара от OTUS:

  • Минимум для работы с системой Git.
    Git - инструмент которым пользуется разработчик на любом языке. Без него сейчас не пишут ни программы для телефонов, ни разрабатывают операционные системы. На уроке мы поговорим для чего нужна система Git, какие операции чаще всего нужны разработчикам и как они используются на курсе. В результате занятия у вас будет возможность создать свой первый пуллреквест и попробуете базовый сценарий по выполнению домашних заданий. Занятие подойдет любому, кто работает с текстовыми документами.
    Зарегистрироваться.

  • Основы Nuxt 3.
    Nuxt 3 - новая версия популярного решения для разработку универсальных и SPA приложений.
    Зарегистрироваться.

Комментарии (34)


  1. Akina
    15.12.2022 20:28
    +20

    Мда...

    Если ставить точку с запятой, то проблемы могут быть исключительно по Вашей вине, из-за несоблюдения именно Вами требований синтаксиса.

    А если не ставить - то ещё и по вине интерпретатора, неверно понявшего Ваши намерения.

    Как по мне, так вывод не просто очевиден - он безальтернативен.


    1. nin-jin
      16.12.2022 06:28
      -5

      Синтаксически некорректный код интерпретатор даже не запустит. Так что если он его запустил, то вина в любом случае Ваша. В обоих случаях связанная с незнанием правил работы ASI.


  1. hardtop
    15.12.2022 21:17
    +13

    «Что-то маловато неопределённостей в js. А давайте ; сделаем не всегда обязательной!»


  1. ultrinfaern
    15.12.2022 21:32

    Хохма в том, что ASI неотключаем. Поэтому теперь всегда нужно писать код так, как если бы псих не смог вставить точку с запятой в ваш код. :)


  1. PavelBelyaev
    15.12.2022 21:54
    -1

    Наверно еще минификаторы могут сломать код без ;


    1. pfffffffffffff
      15.12.2022 23:30

      Не могут


      1. dedmagic
        16.12.2022 10:26
        +1

        Ну, наверное, не минификаторы, а бандлеры.
        Если у вас js-файл начинается с самовызывающейся функции и, соответственно, с открывающей круглой скобки, то при склейке файлов эта скобка окажется где-то в середине кода, и если перед нею нет точки с запятой -- возможны проблемы.


  1. savostin
    15.12.2022 22:02
    -1

    Странно, что не затронута тема минификации кода. Особенно параноидальной, когда true заменяется на !0 потому, что так "экономится 50%". *Кстати, посоветуйте такой, а то мой просто в одну строку все сливает, а хочется экстрима в виде замены переменных на a,b,c и пр. "как у взрослых".

    Сюда же можно было бы добавить "нужно ли заключать блоки кода в {}, если они состоят из одной строки"


  1. Bedal
    15.12.2022 22:19
    +2

    Вспоминается бессмертное DO1I=1.5 против DO1I=1,5


  1. Andchir
    15.12.2022 22:20
    +2

    Используйте Prettier и пишите, как вам нравится.


    1. Fen1kz
      15.12.2022 23:55

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


      1. Andchir
        16.12.2022 15:32

        У Prettier есть много возможностей для настройки и вариантов использования. Например, вы можете использовать одни настройки, которые применяются только перед коммитом, а другие когда работаете непосредственно с кодом. Но на практике я сам такое не пробовал.


  1. SergeiMinaev
    16.12.2022 00:55
    +12

    Как же меня бесило, когда в одном проекте ESLint запрещал ставить ;. Есть куча вариантов, когда пропущенная ; что-то испортит. И ровно 0 ситуаций, когда наоборот. Какой можно сделать вывод? Правильно, давайте придумаем кучу правил, когда не нужно ставить ; , ведь нам больше нечем заняться!

    Заранее, про prettier-ы: даже если они автоматизируют процесс, то это всё равно лишнее переусложнение в попытке решить несуществующую проблему.


    1. nin-jin
      16.12.2022 06:32
      -1

      Какой можно сделать вывод? Правильно, давайте придумаем кучу правил,

      Чтобы удовлетворить комплекс вахтёра некоторых несознательных личностей.

      Ваша проблема не в семиколонах, а в куче бессмысленных правил в линтере.


    1. Andchir
      16.12.2022 15:36

      Кто-то придумал, что ; ему чем-то мешают и переубедить таких нереально. Поэтому проблема существует, к сожалению. Но на счет переусложнения согласен.


  1. k12th
    16.12.2022 03:57
    +3

    Давать сущностям имена больше чем из одной-двух букв тоже необязательно...


  1. IvanPetrof
    16.12.2022 04:29
    +7

    Не понимаю этой суеты вокруг точки с запятой. На мой взгляд, код пишется в первую очередь для программиста (поддерживаемый код). А потому, он (код) должен быть оформлен таким образом, чтобы максимально упростить процесс "парсинга глазами" и минимизировать неоднозначности понимания. Простой пример - сложное условие с использованием арифметических операций, операторов сравнения и логических операторов AND, OR и.т.п. У каждого из них есть приоритет, и среда исполнения без труда разберётся в каком порядке это вычислить. А вот человеку сильно поможет, если в некоторых местах просто поставить скобки, как бы акцентируя внимания на очерёдность (даже если скобки ничего в ней не меняют)


    1. SergeiMinaev
      16.12.2022 04:47
      +2

      Визуальные ориентиры помогают глазам "цепляться" за ключевые участки кода. По этой же причине в Python когда-то решили не убирать двоеточие в `def myfunc():`.


      1. IvanPetrof
        16.12.2022 04:55
        +2

        Ну я собственно это и хотел сказать. Для меня точка с запятой - визуальный ориентир для глаз. я за точку с запятой.


        1. Metotron0
          16.12.2022 08:43

          А я, как перешёл на vue, понял, что без точки с запятой приятнее. Написал fnName(, вторую скобку редактор сам подставил, пиши сразу параметры функции, а потом хоткеем на новую строку. В случае с точкой с запятой не у всех есть хоткей, чтобы ставить её в конце строки, кто-то вынужден сперва нажать end или хотя бы стрелку. Но даже если есть, то несколько выбешивает писать в каждой строке то, что не очень-то нужно. Это как если каждый отступ руками проставлять, а не один раз таб нажать.

          Чего мне не хватает, так это когда в methods пишу новый метод, чтобы запятая после } сама ставилась


          1. IvanPetrof
            16.12.2022 09:06
            +1

            Пройдёт ещё лет 10 и подрастающее поколение будет жаловаться на то, что их задалбывает в каждом проекте формулировать строку ТЗ для codeGPT и ещё и точку в конце предложения ставить))


  1. Riim
    16.12.2022 09:11

    Если не хочется ставить в конце, то можно заметно реже ставить в начале, при определённых правилах всё будет 100% без проблем, вот здесь можно почитать: https://standardjs.com/rules.html#semicolons


    1. Nikeware
      16.12.2022 12:14
      +1

      Ну да, это как руль в машине на заднем сиденье. Очень "удобно"!


      1. Riim
        16.12.2022 13:20

        Ну я если что не предлагаю так делать, мне по большей части пофигу где ставятся ;, предпочитаю больше думать о содержании кода, а оформлением пусть занимается какой-нибудь prettier или что там принято в проекте. Просто скинул ссылку тем кому очень хочется без ;, так что я как-то хз за что тут можно было минусануть мой коммент выше, там просто ссылка и никакого личного мнения.


  1. vetero4eg
    16.12.2022 13:43
    +5

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


  1. haymob
    16.12.2022 13:43
    +1

    Зачем в typescript пишут точку с запятой, если на выходе одинаковый JS?


  1. Arcanum_Viator
    16.12.2022 13:44
    +4

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

    Если вы не используете точки с запятой, то тем самым сэкономите символы в каждой написанной строке кода.

    Плюсы: Экономия 1 байт в строку.

    Минусы: Шанс забыть символ там, где он обязателен и усложнение чтения кода "непросвещёнными", то есть всеми, кто привык видеть более явное окончание строки. Предпочту экономить нервы, а не байты.


    1. Akina
      16.12.2022 14:47
      +1

      Плюсы: Экономия 1 байт в строку.

      Ещё бы найти, кому эти сэкономленные байты продать...


    1. Andchir
      16.12.2022 15:48

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

      Может дело в привычке тех, кто работает сразу как минимум с двумя ЯП? Например, в Python точку с запятой ставить нельзя, так же как фигурные скобки. Дело привычки.


  1. stvoid
    16.12.2022 13:44
    +1

    Мне кажется тот факт, что для выполнения JS в адресной строке браузера, нужно обязательно разделять точкой с запятой - это уже ответ о желательности использования точки с запятой


  1. RAX7
    16.12.2022 14:11

    Есть еще и такой вариант использования точки с запятой для альтернативно одаренных

    Hidden text


  1. KongEnGe
    16.12.2022 15:52

    Мораль: если ваш KPI не включает в себя премирование за экономию точек с запятой -- ставьте их там, где принято всеми.


  1. Alexandroppolus
    16.12.2022 16:09

    Брендан Айк где-нибудь объяснял, зачем в js эта дурацкая анархия с точкозапятой?


    1. nin-jin
      16.12.2022 16:27

      Емнип, он хотел сделать без них, но начальство настояло "шоб было похоже на яву", поэтому получился такой компромисс.